重载下的mysql“通信链路故障” - 休眠

时间:2017-03-24 11:16:45

标签: java mysql multithreading hibernate

我尝试使用许多线程来测试程序(基于hibernate),这些线程访问mysql数据库以创建工作负载。线程具有与数据库的连接,并且能够执行CRUD操作。它可以正常运行大约100个线程但是有超过100个线程我得到了一堆例外 我不知道它是一个休眠问题,一个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

我已经做过一些研究。这里描述了导致问题的常见问题:
https://stackoverflow.com/questions/2983248/com-mysql-jdbc-exceptions-jdbc4-communicationsexception-communications-link-fai

但我认为这个链接的答案在我的情况下没有意义,因为我得到了与数据库的连接。我只遇到了许多线程同时运行的问题。

我更改了以下MySQL变量但没有效果:

  • max_connections = 100000
  • max_connect_errors = 9999
  • connect_timeout = 1000
  • wait_timeout = 99999
  • interactive_timeout = 99999
  • net_write_timeout = 1000

这是创建和启动线程的类:

    public class ReadUpdateTest {

public static void main(String[] args) throws InterruptedException {

    int totalDBRows;
    int totalNumberOfClients = 100;
    int numberOfUpdateClients = 250;

    List<Thread> threadlist = new ArrayList<Thread>();
    Deque customers = new ArrayDeque();

    totalDBRows = (int) MainStatisch.setNumberOfTuplesInDB();


    for (int i = 0; i < numberOfUpdateClients; i++) {
        int randomId = MainStatisch.getRandomInt(1, totalDBRows);
        customers.add(MainStatisch.createRandomCustomer(randomId));
    }


    for (int i = 1; i <= numberOfUpdateClients; i++) {
        threadlist.add(new Thread(new UpdateRandomThread2("UpdateThread - " + i, (Customer) customers.pollFirst())));
    }


    Collections.shuffle(threadlist);


    // ################## start threads ##################

    System.out.println("start: \n");
    long queryStart;
    long queryEnd;
    queryStart = System.currentTimeMillis();

    for (Thread thread : threadlist) {
        thread.start();
    }

    for (Thread thread : threadlist) {
        thread.join();
    }

    queryEnd = System.currentTimeMillis();
    long queryTime = queryEnd - queryStart;


    System.out.println("Time " + queryTime);
}

}

这是我的主题:

   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();

}
}

这是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;
}

}

0 个答案:

没有答案