Создаю пул соединений ,но 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)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Делаю клиент VK в виде бота для TelegramСделал обмен сообщениями в разные стороны, чаты
Нужно проверить если ли пользователь в БД и если нет создать такого
Причина в том что когда вытаскиваю с запроса строку (введеную в поле) вместо русских символов выводятся крякозябры