JDBC多线程多个statement共享同一个connection
2014-01-11 22:57
816 查看
对于mysql测试案例
package 使用同一个connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
String urlString = "";// 数据库连接命令
String usr = "meepo";// 用户名
String passwd = "meepo";// 密码
String driverString = "com.mysql.jdbc.Driver";// 连接驱动命令
urlString = "jdbc:mysql://" + "localhost:5030";
try {
Class.forName(driverString).newInstance();
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Connection connection = null;
try {
connection = DriverManager.getConnection(urlString, usr, passwd);
connection.createStatement().execute("use test;");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 1000000; i++) {
try {
final Statement statement = connection.createStatement();
executorService.execute(new Runnable() {
int k = 10;
@Override
public void run() {
// TODO Auto-generated method stub
try {
for (int j = 0; j < 109; j++) {
statement.executeUpdate("update debug set email='fuck"
+ Thread.currentThread() + new Integer(k++).toString()
+ "' where filename='item0';");
}
//while (resultSet.next()) {
//System.out.println(resultSet.getString(2));
//}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
对于mysql而言在其jdbc接口中已经提供了同步方法多个线程共享同一个connection没有问题。而在实际使用中设计到事物时会出现这种情况:
由于jdbc的事物与一个connection关联在一起,因此当一个statment执行完毕需要提交时,如果调用了connection.commit()或者rollback的话可能会导致其他线程中不希望提交的事物提交
package 使用同一个connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
String urlString = "";// 数据库连接命令
String usr = "meepo";// 用户名
String passwd = "meepo";// 密码
String driverString = "com.mysql.jdbc.Driver";// 连接驱动命令
urlString = "jdbc:mysql://" + "localhost:5030";
try {
Class.forName(driverString).newInstance();
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Connection connection = null;
try {
connection = DriverManager.getConnection(urlString, usr, passwd);
connection.createStatement().execute("use test;");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 1000000; i++) {
try {
final Statement statement = connection.createStatement();
executorService.execute(new Runnable() {
int k = 10;
@Override
public void run() {
// TODO Auto-generated method stub
try {
for (int j = 0; j < 109; j++) {
statement.executeUpdate("update debug set email='fuck"
+ Thread.currentThread() + new Integer(k++).toString()
+ "' where filename='item0';");
}
//while (resultSet.next()) {
//System.out.println(resultSet.getString(2));
//}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
对于mysql而言在其jdbc接口中已经提供了同步方法多个线程共享同一个connection没有问题。而在实际使用中设计到事物时会出现这种情况:
由于jdbc的事物与一个connection关联在一起,因此当一个statment执行完毕需要提交时,如果调用了connection.commit()或者rollback的话可能会导致其他线程中不希望提交的事物提交
相关文章推荐
- 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement
- 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement
- JDBC——Connection,Statement,PreparedStatement,CallableStatement
- 一个获得jdbc方式Connection的静态方法
- c3p0 - JDBC3 Connection and Statement Pooling
- Connection、PreparedStatement、Statement、ResultSet是JDBC编程常用的接口,请分别简述它们的作用?
- JavaWeb - JDBC,DriverManager,Connection,Statement,ResultSet,sql的注入和防止
- 探索多线程使用同一个数据库connection的后果
- JDBC—Connection、Statement、ResultSet
- 由一个多线程共享Integer类变量问题引起的。。。
- 一个未解决的问题:java.lang.AbstractMethodError: oracle.jdbc.driver.OracleConnection.getHoldability()
- 生产者和消费者多线程共享一个仓库(多竞争一)
- 由一个多线程共享Integer类变量问题引起的。。。
- jdbc一个connection 下的事务问题[转]
- JDBC——Connection,Statement,PreparedStatement,CallableStatement
- 一个jdbc connection连接对应一个事务
- java jdbc(二)各接口介绍--Connection,Statement,ResultSet,PreparedStatement,ResultSetMetaData,DatabaseMetaDa
- JDBC主要接口DirverManager、Connection、Statement、PreparedStatement、ResultSet的简介
- c3p0 - JDBC3 Connection and Statement Pooling
- JDBC中Connection、Statement、ResultSet的关闭方法