Пул соединений в java

423
22 января 2017, 14:44

Создаю пул соединений ,но mysql ругается на большое количество соединений,как я понимаю нужно закрыть соединение после его применения. Но разве пул соединений не для этого создан,чтобы держать определенное количество соединений для быстрого доступа к ним из разных потоков? Подскажите пожалуйста,что я делаю не правильно,может я неправильно понимаю механизм работы пула соединений?

package ObjectPool;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
public class PoolController {
ArrayList<Connection> conpool=new ArrayList<Connection>();
public int instancescount=0;
int maxinstancescount=100;
int ex=0;
public PoolController() throws ClassNotFoundException{
Class.forName("org.sqlite.JDBC");
}
public Connection add(){
Connection con=null;
try {
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/lesson","root");
    conpool.add(con);
    instancescount++;
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
return con;
}   
public Connection getconnection(){
Connection con=null;
if(conpool.size()>0){
 con=conpool.get(conpool.size()-1);
conpool.remove(conpool.size()-1);}else {
    if(instancescount<=maxinstancescount){
        ex++;
        //System.out.println(ex);
        con=add();
    }else{
    synchronized(conpool){  
while(conpool.size()<=0){
    try {conpool.wait();} catch (InterruptedException e) {}
}
}       
    }   
}
    return con; 
}
public void release(Connection con){
synchronized(conpool){
    conpool.add(con);
    conpool.notify();
}
}
 }

запускаю несколько потоков для одновременного обращения к базам данных:

     package DataSourcepackage;
   import java.beans.PropertyVetoException;
   import java.io.IOException;
   import java.sql.Connection;
   import java.sql.SQLException;
   import java.sql.Statement;
   import ObjectPool.PoolController;
   public class Mainthread extends Thread {
   DataSource ds;
   int count;
   PoolController poolcontroller;
   public Mainthread(PoolController poolcontroller,int count) throws  IOException, SQLException, PropertyVetoException{
   this.poolcontroller=poolcontroller;
   this.count=count;
   start();
   }
   public void run(){
    Connection con=poolcontroller.getconnection();
    Statement stmt;
    try {
        stmt = con.createStatement();
        String query="INSERT INTO lesson.tele2   VALUES ('asd',"+count+",'eq')";
        stmt.executeUpdate(query);
        poolcontroller.release(con);
       } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }

        }
         }

а это главный класс с которого запускается 500 потоков:

package DataSourcepackage;
import java.beans.PropertyVetoException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;
import ObjectPool.PoolController;
public class experiment {
public static void main(String [] args) throws SQLException,  ClassNotFoundException, IOException, PropertyVetoException{

    PoolController pool=new PoolController();
    long startTime = System.currentTimeMillis();
    for(int i=0;i<500;i++){
        new Mainthread(pool,i);
    }

     }
     }

выдает такое исключение:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data   source rejected establishment of connection,  message from server: "Too many  connections"
  at sun.reflect.GeneratedConstructorAccessor33.newInstance(Unknown Source)
  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:918)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1040)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2284)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2083)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:806)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.GeneratedConstructorAccessor27.newInstance(Unknown Source)
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.ConnectionImpl.getInstance(ConnectionImpl.java:410)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at ObjectPool.PoolController.add(PoolController.java:20)
at ObjectPool.PoolController.getconnection(PoolController.java:39)
at DataSourcepackage.Mainthread.run(Mainthread.java:21)
READ ALSO
Вебхук в ВК или возможна оптимизация LongPoll?

Вебхук в ВК или возможна оптимизация LongPoll?

Делаю клиент VK в виде бота для TelegramСделал обмен сообщениями в разные стороны, чаты

668
Как с помощью isPresent() сделать проверку в JpaRepository?

Как с помощью isPresent() сделать проверку в JpaRepository?

Нужно проверить если ли пользователь в БД и если нет создать такого

336
Не открывается .jar (IDEA IntelliJ)

Не открывается .jar (IDEA IntelliJ)

Столкнулся с проблемой при созданииjar в IDEA

305
Проблема с кодировкой autocomplete

Проблема с кодировкой autocomplete

Причина в том что когда вытаскиваю с запроса строку (введеную в поле) вместо русских символов выводятся крякозябры

330