数据库连接池到底有什么用?一个静态的Connection对象不也可以让多个线程共享吗?
我就想不明白为什么 连接池 里面要用缓存一定数量的Connection对象,用一个静态的Connection对象不也可以多线程共享吗?我实在看不出这样会有什么问题,谁能说一下这个问题?
public class ConnectionProvider {
	//a static variable of type Connection
	private static Connection INSTANCE = initializeConnection();	
	private static Connection initializeConnection() {		
		String driver = "org.gjt.mm.mysql.Driver";
		String db_url = "jdbc:mysql://127.0.0.1/mydata";
		String username = "root";
		String password = "root";
		Connection conn = null;
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(db_url, username, password);
			System.out.println(conn.getCatalog());
		} catch (
ClassNotFoundException e) {
			e.printStackTrace();
		} catch (
SQLException e) {
			e.printStackTrace();
		}
		System.out.println(conn + "--Connection initialized.");
		return conn;
	}	
	//after the initialization work's been done, this method returns the SAME Connection object when requested
	public static Connection getConnection() {
		return INSTANCE;
	}
}
---------------------------------------------------------
以下创建了100个线程,获得同一个Connection对象,并执行一个插入的操作
public class Test {
	public static void main(String args[]) {		
		for(int i = 0; i < 1000; i++) {
			new MyThread().start();
		}
	}
}
class MyThread extends Thread{
	public void run() {
		Connection conn = getConnection();
		try {
			//sleep for one second so that other threads have chances to run and obtain the SAME Connection object  
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		doSomethingWithDB(conn);
	}	
	private Connection getConnection() {
		return ConnectionProvider.getConnection();
	}	
	private void doSomethingWithDB(Connection conn) {
		String sql = "INSERT INTO test(id, content) VALUES(null, ?)";
		try {
			PreparedStatement pstm = conn.prepareStatement(sql);
			pstm.setString(1, Thread.currentThread().getName());			
			int flag = pstm.executeUpdate();
			if(flag == 1)
				System.out.println(Thread.currentThread().getName() + ": Data inserted successfully!");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
------解决方案--------------------我觉得数据库连接池就是为了解决资源的频繁分配和释放所造成的问题。为解决这些问题,采用数据库连接池技术。
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量?使用情况,为系统开发?测试及性能调整提供依据。
楼主那种做法虽说也实现了,但是从效率上和智能上,都不是太理想,你必须要自己关闭Connection连接,所以,是属于人工的,而数据库连接池是属于智能的!说的不对的地方,请指教!
------解决方案--------------------我要是一直拿着连接,不释放呢?
------解决方案--------------------那事务你怎么处理!这样就存在读【脏数据】问题!所以必须分开连接