Java mysql“;“通信链路故障”;在重负载下-休眠
我尝试测试一个程序(基于hibernate),其中有许多线程访问mysql数据库以创建工作负载。这些线程连接到数据库,能够执行CRUD操作。它可以在大约100个线程上正常工作,但在超过100个线程的情况下,我会遇到一些异常。Java mysql“;“通信链路故障”;在重负载下-休眠,java,mysql,multithreading,hibernate,Java,Mysql,Multithreading,Hibernate,我尝试测试一个程序(基于hibernate),其中有许多线程访问mysql数据库以创建工作负载。这些线程连接到数据库,能够执行CRUD操作。它可以在大约100个线程上正常工作,但在超过100个线程的情况下,我会遇到一些异常。 我不知道这是hibernate问题、Mysql问题还是工作量太大(但我认为应该可以处理100多个线程) 希望有人能告诉我如何在没有异常的情况下运行更多线程 Exception in thread "Thread-1" org.hibernate.exception.
我不知道这是hibernate问题、Mysql问题还是工作量太大(但我认为应该可以处理100多个线程) 希望有人能告诉我如何在没有异常的情况下运行更多线程
Exception in thread "Thread-1" org.hibernate.exception.JDBCConnectionException: Could not open connection
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:132)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:221)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1426)
at com.sedicoloadtest2.UpdateRandomThread2.run(UpdateRandomThread2.java:24)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121)
at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:673)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1084)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2483)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2516)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2301)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.GeneratedConstructorAccessor10.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
at org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.getConnection(DriverManagerConnectionProviderImpl.java:204)
at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292)
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:214)
... 6 more
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3052)
at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:597)
... 21 more
这是sessionFactory:
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
Configuration configuration = configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
SessionFactory factory = configuration.buildSessionFactory(serviceRegistry);
return factory;
}
private static Configuration configure() {
Configuration configuration = SedicoBootstrapper.getHibernateConfiguration()
.setProperty("format.sql", "true")
.setProperty("hibernate.current_session_context_class", "thread")
.setProperty("hibernate.c3p0.min_size", "1")
.setProperty("hibernate.c3p0.max_size", "1000")
.addAnnotatedClass(Customer.class);
return configuration;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
为什么要使用循环中线程的join()方法?等待所有线程完成,然后测量当前时间。否则我会测量时间,一些线程仍在进行中。我想知道线程需要多长时间才能完成这些工作。您正在使用连接池吗?如果不是的话,你应该是。请参阅我不确定连接池配置(尝试使用c3p0)。我添加了sessionFactory的代码。为什么要使用循环中线程的join()方法?等待所有线程完成,然后测量当前时间。否则我会测量时间,一些线程仍在进行中。我想知道线程需要多长时间才能完成这些工作。您正在使用连接池吗?如果不是的话,你应该是。请参阅我不确定连接池配置(尝试使用c3p0)。我添加了sessionFactory的代码。
class UpdateRandomThread2 implements Runnable {
String threadname;
Customer updateCustomer;
UpdateRandomThread2(String threadname, Customer customer) {
this.threadname = threadname;
this.updateCustomer = customer;
}
public void run() {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
com.sedicoloadtest2.MainStatisch.updateRandomCustomer(session, updateCustomer);
session.getTransaction().commit();
session.close();
}
}
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
Configuration configuration = configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
SessionFactory factory = configuration.buildSessionFactory(serviceRegistry);
return factory;
}
private static Configuration configure() {
Configuration configuration = SedicoBootstrapper.getHibernateConfiguration()
.setProperty("format.sql", "true")
.setProperty("hibernate.current_session_context_class", "thread")
.setProperty("hibernate.c3p0.min_size", "1")
.setProperty("hibernate.c3p0.max_size", "1000")
.addAnnotatedClass(Customer.class);
return configuration;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}