java jdbc中的连接太多
Posted
技术标签:
【中文标题】java jdbc中的连接太多【英文标题】:Too many connection in java jdbc 【发布时间】:2017-06-23 11:40:39 【问题描述】:错误:- 严重:空 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:数据源拒绝建立连接,来自服务器的消息:“连接太多” 代码如下所示
try
BufferedReader br=new BufferedReader(new FileReader(filename));
String line;
String tru="TRUNCATE `project`.`uploadtable`;";
try
Statement stmt = Dutil.getConnection().createStatement();
stmt.executeUpdate(tru);
catch(Exception e)
try
while((line=br.readLine())!=null)
String values[]=line.split("\t");
String[] splitStr = values[1].split(" ");
try String sql="INSERT INTO `project`.`uploadtable`
(`empid`, `date`, `time`, `in_out_index`) VALUES
('"+values[0]+"', '"+splitStr[0]+"', '"+splitStr[1]+"',
'"+values[3]+"');";
PreparedStatement
pst=Dutil.getConnection().prepareStatement(sql);
pst.executeUpdate();
catch (SQLException ex)
System.out.println("Error");
Logger.getLogger(UploadFrame.class.getName()).log(Level.SEVERE,
null, ex);
br.close();
this.dispose();
LogButtonFrame lbf=new LogButtonFrame();
lbf.clockinouttable();
JOptionPane.showMessageDialog(null,"Upload Complete"); catch
(IOException ex)
Logger.getLogger(UploadFrame.class.getName()).log(Level.SEVERE,
null, ex);
catch (FileNotFoundException ex)
Logger.getLogger(UploadFrame.class.getName()).log(Level.SEVERE,
null, ex);
catch (Exception ex)
JOptionPane.showMessageDialog(null, "Error");
【问题讨论】:
请发布您的代码不要使用图片 您需要在使用完语句和连接后关闭它们,否则它们将保持打开状态,并且在某些时候您会收到此错误。见:Processing SQL Statements with JDBC 【参考方案1】:问题是:
PreparedStatement pst = Dutil.getConnection().prepareStatement(sql);
您还没有显示Dutil
的代码,但假设它在每次调用时创建一个新连接,这意味着连接没有关闭,这取决于运气、驱动程序实现细节和垃圾收集器来获取它关闭了。
你应该使用try-with-resources:
try (Connection connection = Dutil.getConnection();
PreparedStatement pst = connection.prepareStatement(sql))
// Use pst
在这个block结束后,pst
和connection
都会被正常关闭,即使发生异常等等。
【讨论】:
【参考方案2】:您似乎在创建连接,但从未关闭它们,尽管从您发布的图像中很难分辨出来。
【讨论】:
在哪里关闭连接? 您在哪里执行 INSERT 语句。您应该考虑使用try / catch / finally
或try with resources
。互联网上有很多示例,我想 Jesper 在您的问题的评论中添加的链接会详细介绍它【参考方案3】:
如果您的应用程序需要多个连接,则应使用 Apache DB 连接池等连接池,您可以在其中配置连接数。这是 DBCP 文档的链接https://commons.apache.org/proper/commons-dbcp/
如果您确定您的应用程序只需要一个连接,请将您的连接对象设置为 DBUtil 类中的 Singleton 对象。这肯定会解决问题,无需关闭连接。您的整个应用程序将使用单个连接对象连接到数据库。
【讨论】:
以上是关于java jdbc中的连接太多的主要内容,如果未能解决你的问题,请参考以下文章