由JDBC事务引起的锁状态以及内存数据无法写入数据库的问题

项目在本地运行正常,但在服务器上出现数据无法写入数据库和事务锁问题。分析发现,关闭数据库连接后,新连接的自动提交仍保持关闭状态,导致后续数据无法写入。解决办法是在finally块中手动开启自动提交,并在catch块中进行事务回滚,以防异常导致的事务锁定。
摘要由CSDN通过智能技术生成

最近在做项目的时候,踩了一个大坑,为了排查BUG所在,花费了大量的时间。所以觉得应该来一个“填坑之路”系列,自己踩过的坑,希望各位看官能及时绕开。得亏看到了,要不然踩着了!

事情是这样的,开发完成的一个项目,在本地测试表现正常,没有问题。但在发布到服务器上之后,问题就出现了,一开始会出现用户添加的数据无法写入数据库的情况,重启数据库之后,一段时间内数据可以及时写入,但一段时间之后又会出现内存中数据无法写入数据库的情况。具体表现为:在Web页面写入数据后,可以在页面看到数据的变化,但进入数据库查询却看不到任何改变。另外,在整个系统访问人数增多之后,会不时地出现事务锁的情况,后台报错为:数据库等待超时或数据库出现死锁。

之后就是分析问题,然后各种猜测:数据库版本不对?数据库配置缓存区设置过大?数据库自动提交默认关闭?数据库引擎问题?数据源连接池采用了单例模式?在排除了以上所有可能之后,我看到了一行代码

conn.setAutoCommit(false);

会不会是这里我要开启事务因而关闭自动提交的原因?但是下面还有一行呢

if (conn != null) {
    conn.close();
}<
数据写入数据库的源代码通常是软件开发中的一个常见任务,涉及到与数据库交互的部分,比如通过SQL语句或者使用特定的数据访问技术(如ORM)。下面给出一个简单的例子,使用Java语言结合JDBC(Java Database Connectivity)API来演示如何将数据写入数据库的过程。 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class DatabaseInsertExample { public static void main(String[] args) { // 数据库连接URL,用户名和密码 String url = "jdbc:mysql://localhost:3306/your_database"; String user = "your_username"; String password = "your_password"; // SQL插入语句 String sql = "INSERT INTO your_table (column1, column2) VALUES (?, ?)"; // 使用try-with-resources自动关闭资源 try ( // 加载驱动并建立数据库连接 Connection conn = DriverManager.getConnection(url, user, password); // 创建PreparedStatement对象用于执行SQL语句 PreparedStatement pstmt = conn.prepareStatement(sql) ) { // 设置参数值 pstmt.setString(1, "value1"); pstmt.setInt(2, 123); // 执行插入操作 int rowsAffected = pstmt.executeUpdate(); System.out.println("成功插入数据,影响的行数:" + rowsAffected); } catch (SQLException e) { e.printStackTrace(); } } } ``` 在这个例子中,我们首先导入了必要的JDBC类。然后,创建了一个`DatabaseInsertExample`类,在它的`main`方法中,我们使用JDBC API建立与数据库的连接,创建一个`PreparedStatement`对象,并用它来执行插入数据的操作。在`try-with-resources`块中,我们确保数据库连接和`PreparedStatement`对象在使用完毕后会被正确关闭。 这个例子展示了数据写入数据库的基本流程,实际应用中可能需要考虑更多的异常处理、事务管理以及性能优化等问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值