java connection 可以有多个statement 吗_JDBC connection和statement的关系

一个Connection生成多个Statement, 这些Statement可以同时并行的执行吗?

class Runner implements Runnable {

private Connection conn;

public Runner(Connection conn) {

this.conn = conn;

}

@Override

public void run() {

try {

Statement stmt = conn.createStatement();

String sql = "select * from user";

ResultSet rs = stmt.executeQuery(sql);

} catch(Exception e) {

e.printStackTrace();

}

}

}

Connection conn = MysqlDBUtil.getConnection();

Runner runner = new Runner(conn);

for(int i=0;i<100;i++) {

Thread t = new Thread(runner);

t.start();

}

同一个Connection,同时起了100个Statement,测试了一下如果Statement数目比较少似乎能同时执行?如果可以的话,那么一个网站只用开一个Connection,然后每个请求分别建立不同的Statement就可以了吗?个人认为一个Connection下面可以同时执行的Statement是有上限的。

更新:

MySQL下,一个connection生成了50000个Statement都不报错,而Oracle会报

maximum open cursors exceeded

之类的错误:http://stackoverflow.com/questions/12192592/java-sql-sqlexception-ora-01000-maximum-open-cursors-exceeded

根据stackoverflow的解答,

Each SELECT statement has a cursor

,这个错误的原因还是

open statement

过多。为什么MySQL没有这样的问题?Oracle的cursor在MySQL中对应什么呢?

你执行的语句是查询,查询是读锁,100个查询都可以读取相同的数据,因此100个查询之间相互之间是没有影响的。但是对于更新就不是这样了,尤其是涉及到事务的时候。事务是以连接Connection为单位的,在JDBC中,默认autocommit是true,所以每一个SQL语句都是一个事务。当你在同一个连接上,创建不同的Statement的时候,是没法保证事务的ACID特性的,数据不一致就会发生,程序就是错误的。创建Connection是十分耗时的操作,一般情况下,都是使用连接池,比如c3p0,需要Connection的时候就去连接池取。Spring的事务管理是把Connection与当前线程关联起来实现事务。

理论上(也就是根据jdbc规范),connection对象是线程安全的,但实际当中不敢保证所有jdbc驱动都会遵守该规范。所以最好还是不要这么做,而是使用连接池,每个线程单独从连接池中获得connection对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值