这个锁等待超时是什么意思啊
#连接设置driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcStudy?
useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=18870025610
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
3、编写工具类 JdbcUtils_DBCP
connectionProperties=useUnicode=true;characterEncoding=UTF8
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:
Informix)
defaultReadOnly=
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED,REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
这个是配置文件
package zwl.lesson5;
import com.mysql.jdbc.JDBC4UpdatableResultSet;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class jdbcUtils_pool {
private static DataSource ds =null;
static {
try {
InputStream in = jdbcUtils_pool.class.getClassLoader().getResourceAsStream("dbconfig.properties");
Properties properties = new Properties();
properties.load(in);
ds = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接 DriverManager.getConnection(url, username, password);
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//释放资源
public static void release( Connection coon,Statement st, ResultSet re) {
if (re != null) {
try {
re.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (coon != null) {
try {
coon.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
package zwl.lesson5;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TextPool {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
conn= jdbcUtils_pool.getConnection();
String sql="INSERT INTO `users`(`id`,`NAME`,`PASSWORD`) VALUE(?,?,?)";
st=conn.prepareStatement(sql);
st.setInt(1,5);
st.setString(2,"kuangsheng");
st.setString(3,"334223");
int i=st.executeUpdate();
if(i>0)
{
System.out.println("插入成功");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
jdbcUtils_pool.release(conn,st,rs);
}
}
}
E:\JAVAJDK\bin\java.exe "-javaagent:E:\IDEA Community\IntelliJ IDEA Community Edition 2021.3.1\lib\idea_rt.jar=62489:E:\IDEA Community\IntelliJ IDEA Community Edition 2021.3.1\bin" -Dfile.encoding=UTF-8 -classpath "E:\JAVAJDK\jre\lib\charsets.jar;E:\JAVAJDK\jre\lib\deploy.jar;E:\JAVAJDK\jre\lib\ext\access-bridge-64.jar;E:\JAVAJDK\jre\lib\ext\cldrdata.jar;E:\JAVAJDK\jre\lib\ext\dnsns.jar;E:\JAVAJDK\jre\lib\ext\jaccess.jar;E:\JAVAJDK\jre\lib\ext\jfxrt.jar;E:\JAVAJDK\jre\lib\ext\localedata.jar;E:\JAVAJDK\jre\lib\ext\nashorn.jar;E:\JAVAJDK\jre\lib\ext\sunec.jar;E:\JAVAJDK\jre\lib\ext\sunjce_provider.jar;E:\JAVAJDK\jre\lib\ext\sunmscapi.jar;E:\JAVAJDK\jre\lib\ext\sunpkcs11.jar;E:\JAVAJDK\jre\lib\ext\zipfs.jar;E:\JAVAJDK\jre\lib\javaws.jar;E:\JAVAJDK\jre\lib\jce.jar;E:\JAVAJDK\jre\lib\jfr.jar;E:\JAVAJDK\jre\lib\jfxswt.jar;E:\JAVAJDK\jre\lib\jsse.jar;E:\JAVAJDK\jre\lib\management-agent.jar;E:\JAVAJDK\jre\lib\plugin.jar;E:\JAVAJDK\jre\lib\resources.jar;E:\JAVAJDK\jre\lib\rt.jar;C:\Users\a2032\Desktop\JAVA cod\zwl\out\production\zwl;C:\Users\a2032\Desktop\JAVA cod\zwl\lib\commons-dbcp-1.4.jar;C:\Users\a2032\Desktop\JAVA cod\zwl\lib\commons-pool-1.6.jar;C:\Users\a2032\Desktop\JAVA cod\zwl\lib\mysql-connector-java-5.1.47.jar" zwl.lesson5.TextPool
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:952)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2495)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1903)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2124)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2058)
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5158)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2043)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at zwl.lesson5.TextPool.main(TextPool.java:23)
Process finished with exit code 0
这个是我的文件目录结构,不知道哪里错了 从错误信息来看,你遇到了一个`com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction`的异常。这个异常表示在执行数据库事务时,等待锁的时间超过了设定的超时时间。
通常情况下,这个异常出现的原因是由于并发操作导致的。在你的代码中,你执行了一条插入语句`INSERT INTO users (id, NAME, PASSWORD) VALUE(?,?,?)`,如果在同一时刻有其他线程或者连接也在访问该表,可能会导致锁等待超时的问题。
解决这个问题的方法可以有以下几种:
1. 增加等待时间:可以尝试增加`maxWait`属性的值,从当前配置来看,`maxWait`设置为60000,即60秒。你可以将其增加到更大的值,比如120秒,来给其他连接更多的时间来释放锁。
2. 优化查询语句:检查并优化你的查询语句,确保只锁定必要的行和表,减少锁定时间。
3. 使用隔离级别:将数据库的隔离级别设置为更高的级别(如`READ_COMMITTED`)可以减少锁等待时间。
4. 重新设计数据表结构:如果锁等待问题经常发生,可能需要重新设计数据表结构,以减少并发操作导致的锁等待。
另外,关于你提供的代码和文件目录结构,我没有看到明显的问题。如果你能提供更多的错误信息或者日志,我可以帮你更具体地定位问题所在。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-3-26 12:25
从错误信息来看,你遇到了一个`com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock ...
我等了很久但是还是没用,我现在从sqlyog去删除这个id=5的数据也会报这个错,但是我一个时间只执行了一个数据,应该不是并发导致的吧,我没有多调用哇 孤世星辰 发表于 2024-03-26 12:45
我等了很久但是还是没用,我现在从sqlyog去删除这个id ...
如果你在执行单个插入语句时就遇到了锁等待超时的问题,并且没有并发调用的情况,那可以考虑以下几点:
1. 数据库配置问题:检查数据库的配置文件,确保没有设置不合理的超时时间或其他限制。特别注意检查`innodb_lock_wait_timeout`参数,该参数定义了InnoDB存储引擎的锁等待超时时间,可以尝试将其调大。
2. 数据库表结构问题:检查数据表的索引和约束,确保它们能够有效地支持并发操作。有时候索引过少或者过多,或者约束设计不当也会导致锁等待的问题。
3. 数据库性能问题:检查数据库服务器的性能,确保其资源充足,并且没有其他操作导致了性能瓶颈。例如,磁盘IO、CPU和内存等方面是否正常。
4. 其他会导致锁等待的操作:除了你的代码中的插入语句,其他应用程序或者线程是否在执行与该表相关的操作?如果是的话,可能会导致锁等待的现象。可以通过查询数据库的`SHOW PROCESSLIST;`命令来查看当前正在执行的数据库操作。
希望以上建议对你有所帮助。如果问题仍然存在,请提供更多的上下文信息,以便我们能够更深入地帮助你解决问题。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 {:5_106:}
页:
[1]