数据库连接池到底有什么用?一个静态的Connection对象不也可以让多个线程共享吗?

kevinlooks 2007-11-23 10:39:53
我就想不明白为什么 连接池 里面要用缓存一定数量的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();
}
}
}
...全文
649 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohanjiang 2010-07-10
  • 打赏
  • 举报
回复
老兄的这个问题提的很好,我也一直在想,大家同用一个连接,是否根本就不需要连接池了呢。
今天做了实验,发觉会有如下问题。
在存在是更新事务的时候,
如果是同一个连接,那么只要最先提交事务的能够进行更新数据,其它事务就不能更新数据了。

也就是同一个连接,无法对事务进行并发处理。否则只能处理成功第一个事务。
比如两个并发事务
String s1="update ccl_bd_protocoldata set name='1'";
String s2="update ccl_bd_protocoldata set name='2'";
如果第一个提交成功了,那么第二个是无法提交成功的。
myooo 2008-08-04
  • 打赏
  • 举报
回复

Connection con=getConnection()

当你 con.close()后你调用的Connection就会关闭,别人就用不了,

如果出现多个 Connection con=getConnection() 而且con都不关闭我不知会出现什么后果

我开始也是用的静态的Connection 跟楼主差不多,但是新建的con关闭以后其它的数据库

操作都提示Connection 关闭,如果不关闭我又不知道会怎么样,会不会导致连接池耗尽。

但是静态的Connection 效率的确是很高,我也是找不到好的解决办法才搜到此贴的




ChDw 2007-11-29
  • 打赏
  • 举报
回复
那事务你怎么处理!这样就存在读【脏数据】问题!所以必须分开连接
xiudawong 2007-11-29
  • 打赏
  • 举报
回复
我要是一直拿着连接,不释放呢?
醉面韦陀 2007-11-28
  • 打赏
  • 举报
回复

我觉得数据库连接池就是为了解决资源的频繁分配和释放所造成的问题。为解决这些问题,采用数据库连接池技术。
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量?使用情况,为系统开发?测试及性能调整提供依据。
楼主那种做法虽说也实现了,但是从效率上和智能上,都不是太理想,你必须要自己关闭Connection连接,所以,是属于人工的,而数据库连接池是属于智能的!说的不对的地方,请指教!
kevinlooks 2007-11-23
  • 打赏
  • 举报
回复
请耐心一点,看一下代码,代码其实不多的,就一个测试类,一个线程类,非常简单,请耐心一点,谢谢!

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧