关于java 运行顺序的问题

打算做一个数据库连接池的实现,结果遇到了对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。

     本人很菜,麻烦各位指点一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值