打算做一个数据库连接池的实现,结果遇到了对java运行顺序理解的困惑。麻烦大家帮忙看看,具体问题在下面给出。
这个是工具类。
package com.jdbc.comm;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.jdbc.connection.DataSource;
public class JdbcUtils {
//非常不解,这一步为什么要在static块前运行!!!
//初始化的时候应该是静态方法(包括静态块)要在非静态属性前面嘛!
private DataSource dataSource = new DataSource();
private JdbcUtils() {
}
private static JdbcUtils instance = new JdbcUtils();
public static JdbcUtils getInstance() {
return instance;
}
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
Connection conn = dataSource.getConnection();
return conn;
}
public void free(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (conn != null) {
dataSource.free(conn);
}
}
}
}
}
这个是自己写的一个DataSource。
package com.jdbc.connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
public class DataSource {
private Connection conn = null;
private String url = "jdbc:mysql://localhost:3306/jdbc";
private String username = "root";
private String password = "zzx";
private int maxCount = 5;
private int currentCount = 0;
private LinkedList<Connection> connectionPool = new LinkedList<Connection>();
public DataSource(){
this.createConnection();
}
private LinkedList<Connection> createConnection(){
try {
for(int i=0;i<maxCount;i++){
conn = DriverManager.getConnection(url, username, password);
currentCount++;
connectionPool.addLast(conn);
}
return connectionPool;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public Connection getConnection(){
if(conn != null){
conn = connectionPool.removeFirst();
currentCount--;
}
return conn;
}
public void free(Connection conn){
if(currentCount < maxCount){
connectionPool.addLast(conn);
currentCount++;
}
}
}
下面这个是测试代码
package com.jdbc.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.jdbc.comm.JdbcUtils;
public class DataSourceTest {
public static void main(String[] args) throws SQLException{
Connection conn = null;
PreparedStatement ps =null;
ResultSet rs = null;
JdbcUtils jdbcUtils = JdbcUtils.getInstance();
for(int i=0;i<10;i++){
conn = jdbcUtils.getConnection();
System.out.println(conn);
}
}
}
这个程序运行出错,我已经知道出错的地方,简单来说就是Class.forName("com.mysql.jdbc.Driver")出现在conn = DriverManager.getConnection(url, username, password)后面,所以抛了异常。我也知道怎么改,但是我非常想不通的一点就是,当条用jdbc的构造函数的时候,为什么不先执行JdbcUtils里的静态块,而是先实例化了DataSource。
本人很菜,麻烦各位指点一下。
分享到:
相关推荐
本文将详细解析Java类的基本运行顺序,包括加载、初始化、执行等阶段,以及相关工具的运用。 首先,我们从类的生命周期开始。一个Java类的生命周期可以分为以下几个阶段: 1. **加载(Loading)**:当Java虚拟机...
标题中的“java简单方法顺序调用注解”是指使用注解来控制类中方法的执行顺序。这在某些场景下非常有用,比如初始化逻辑、测试脚本或者需要特定顺序执行的任务。下面我们将深入探讨如何实现这一功能。 首先,我们...
Java类的执行顺序是编程过程中一个非常重要的概念,特别是在深入理解和优化代码性能时。本文将详细探讨Java类的加载、初始化、执行等步骤,并通过实例分析阿里面试中可能涉及的相关问题,结合流程图帮助理解这一过程...
在Java编程语言中,按顺序创建文件涉及到一系列的文件操作步骤。主要使用到的类是`java.io`包中的`File`和`BufferedWriter`。`File`类用于处理文件路径,创建、删除文件等操作,而`BufferedWriter`则用于向文件中...
在Java编程语言中,顺序结构是最基础的程序控制结构之一,它按照代码的书写顺序逐行执行。在“Java学习~求三角形面积的顺序结构”这个主题中,我们将深入探讨如何利用Java来计算三角形的面积,并了解相关概念。 ...
Java实现顺序栈是一种常见的数据结构操作,主要用于存储和管理元素序列。栈是一种后进先出(LIFO,Last In First Out)的数据结构,通常用于执行回溯、递归等算法。在Java中,我们可以使用数组或ArrayList来实现顺序...
最后,关于给定的压缩文件"java读取csv.rar"和"java 按顺序创建文件.zip",它们可能是包含相关示例代码或数据的压缩包。你可以解压这些文件,查看其中的Java源代码或CSV数据,以便于学习和实践上述概念。记住,实践...
在Java编程语言中,程序初始化的顺序是一个关键概念,它涉及到类加载、对象创建以及执行流程的安排。了解这些顺序对于编写高效、无错误的代码至关重要。以下是对Java程序初始化顺序的详细说明: 1. **类加载阶段**...
运行这段代码,我们将会看到原始顺序表和逆置后的顺序表,从而验证算法的有效性。 这个简单的案例展示了数据结构中的基本操作,以及如何在Java中实现这些操作。对于理解和应用数据结构来说,这样的实践案例是非常有...
这个"Java类的基本运行顺序"教程可能还涵盖了如何通过自定义类加载器来扩展类的加载行为,以及如何调试类加载问题等内容。了解这些基础知识对于理解和优化Java应用程序的性能至关重要,尤其是在大型企业级应用中。 ...
标题 "Drools 规则执行顺序" 涉及的是一个业务规则引擎——Drools 的核心概念。Drools 是一个开源的Java决策管理平台,它允许开发者使用规则语言来编写业务逻辑,这些规则可以按特定顺序执行,以处理复杂的业务场景...
在深入探讨Java类的完整构造执行顺序之前,我们先来明确一下Java中构造函数与类初始化的基本概念。构造函数在创建对象时被调用,用于初始化该对象的状态。而类初始化则是指在类首次被使用时,JVM执行的一系列初始化...
Java JRE 1.8,全称为Java Runtime Environment,是Oracle公司提供的用于执行Java应用程序的必备组件。它包含了Java虚拟机(JVM)、类库以及其他支持Java程序运行的必要组件。JRE 1.8是Java发展过程中的一个重要版本...
顺序存储结构线性表的java实现代码,要在jdk1.6以上环境下运行
在Java编程中,多线程同步是一个常见的挑战,特别是在需要线程按照特定顺序执行任务时。本主题聚焦于如何使用Java实现10个线程按照顺序打印数字1到100。这种问题通常通过线程间通信和同步机制来解决,如`...
总结来说,Java的for循环执行顺序是:初始化 -> 条件检查 -> 循环体 -> 更新 -> 重新检查条件。`break`语句可以在满足特定条件时提前结束循环,避免执行后续的循环体和更新部分。了解这个执行顺序对于编写高效的循环...
首先,你需要下载Java Development Kit (JDK),这是Java编程的基础,包含了编译器、Java运行时环境和其他工具。安装JDK后,你需要配置环境变量,包括JAVA_HOME、PATH和CLASSPATH,使得操作系统能够识别并执行Java...
记住,面试有可能会标出一些语句的,让你选择这些语句的执行顺序。不过只要知道原理,就没什么难的了。 执行先后顺序: 1、类加载到内存时static 加载进内润 2、调用类的构造方法时先调用父类的构造方法,在调用...
类--初始化块"); 39. } 40. // 构造器 41. public SubClass() { 42. System.out.println("子类--构造器"); 43. } 44. 45. public static void main(String[]...因此,掌握类的初始化顺序是每个Java开发者必备的知识点。