Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多线程环境中使用JDBC getGeneratedKeys函数_Java_Mysql_Multithreading_Jdbc_Auto Increment - Fatal编程技术网

Java 在多线程环境中使用JDBC getGeneratedKeys函数

Java 在多线程环境中使用JDBC getGeneratedKeys函数,java,mysql,multithreading,jdbc,auto-increment,Java,Mysql,Multithreading,Jdbc,Auto Increment,我有一个web应用程序,它使用一个表的自动增量值插入到其他表中。我需要确保在该表中存在潜在的并发INSERTs时,为自动增量列读取的值是正确的。由于每个线程都有自己的连接(来自容器池),我还需要将代码放在事务中吗 PreparedStatement ps=null; 结果集rs=null; 字符串sql=“插入KYC_记录…”; int autoIncKeyFromApi=-1; 连接=。。。。 试试{ connection.setAutoCommit(false); ps=connection

我有一个web应用程序,它使用一个表的
自动增量
值插入到其他表中。我需要确保在该表中存在潜在的并发
INSERT
s时,为自动增量列读取的值是正确的。由于每个线程都有自己的连接(来自容器池),我还需要将代码放在事务中吗

PreparedStatement ps=null;
结果集rs=null;
字符串sql=“插入KYC_记录…”;
int autoIncKeyFromApi=-1;
连接=。。。。
试试{
connection.setAutoCommit(false);
ps=connection.prepareStatement(sql、语句.返回生成的密钥);
ps.setString(…);
ps.executeUpdate();
rs=ps.getGeneratedKeys();
如果(rs.next()){
autoIncKeyFromApi=rs.getInt(1);
}否则{
//从这里抛出一个异常
}    
commit();
}

列的自动增量值在数据库级别进行管理。因此,在多线程环境中,您可以将值获取到
getGeneratedKeys()

只要调用update SQL语句,事务就会启动。它发生在数据库级别。它将保持打开状态,直到您手动提交或启用自动提交


如果您需要获取有关交易的更多信息,请参阅。

是。JDBC连接不是线程安全的。数据库行为由事务管理器控制。生成的密钥是每个连接的本地密钥。因此它是线程安全的(假设每个线程都有自己的
java.sql.Connection
),连接来自容器(Liferay Tomcat)池。即使连接跨线程重用,池也不会为两个并发运行的线程提供相同的连接。