简单线程系列7-Java+Mysql可能会出问题
2012-05-17 22:44
561 查看
代码:
只贴出错误:
修改源码,下面一段加上:
问题依旧。
先是怀疑是mysql的问题,然后,我换了数据库,换成了sql server 2005
开始计数,总共运行了4502次,之后开始出现错误。
下面贴出我最终的代码,现在感觉有点乱,肯定有问题的,Java不可能是这样的。
问题终于解决了:解决方法:
http://support.microsoft.com/kb/196271
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
值名称: MaxUserPort
值类型: DWORD
值数据: 65534
import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import java.sql.*; public class thdd { public static void main(String[] args) throws InterruptedException { ExecutorService pool = Executors.newSingleThreadExecutor(); for (;;) { Thread.sleep(10); Thread t = new MyThread(); pool.execute(t); } } } class MyThread extends Thread { public void run() { String driver1 = "com.mysql.jdbc.Driver"; String url1 = "jdbc:mysql://db.db.db:3306/test"; String user1 = "root"; String password1 = "1234567890"; try { Class.forName(driver1); Connection conn1 = DriverManager.getConnection(url1, user1, password1); Statement statement1 = conn1.createStatement(); String sql1 = "select * from t_test"; ResultSet rs1 = statement1.executeQuery(sql1); while (rs1.next()) { Date now = new Date(); SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); System.out.println(format.format(now) + "\t" + rs1.getString("ID") + "\t" + rs1.getString("Name")); } rs1.close(); conn1.close(); } catch (Exception e) { e.printStackTrace(); } } }
只贴出错误:
For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel o r system reconfiguration may also be required. For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q19627 1). at sun.reflect.GeneratedConstructorAccessor8.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1 116) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2 370) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) at sun.reflect.GeneratedConstructorAccessor4.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :305) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at MyThread.run(thdd.java:26) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.net.BindException: Address already in use: connect at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) at java.net.AbstractPlainSocketImpl.connect(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.ja va:257) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294) ... 17 more com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The driver was unable t o create a connection due to an inability to establish the client portion of a s ocket. This is usually caused by a limit on the number of sockets imposed by the operat ing system. This limit is usually configurable. For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel o r system reconfiguration may also be required. For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q19627 1). at sun.reflect.GeneratedConstructorAccessor8.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1 116) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2 370) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) at sun.reflect.GeneratedConstructorAccessor4.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :305) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at MyThread.run(thdd.java:26) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.net.BindException: Address already in use: connect at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) at java.net.AbstractPlainSocketImpl.connect(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.ja va:257) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294) ... 17 more com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The driver was unable t o create a connection due to an inability to establish the client portion of a s ocket. This is usually caused by a limit on the number of sockets imposed by the operat ing system. This limit is usually configurable. For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel o r system reconfiguration may also be required. For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q19627 1). at sun.reflect.GeneratedConstructorAccessor8.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1 116) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2 370) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) at sun.reflect.GeneratedConstructorAccessor4.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :305) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at MyThread.run(thdd.java:26) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.net.BindException: Address already in use: connect at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) at java.net.AbstractPlainSocketImpl.connect(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.ja va:257) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294) ... 17 more com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The driver was unable t o create a connection due to an inability to establish the client portion of a s ocket. This is usually caused by a limit on the number of sockets imposed by the operat ing system. This limit is usually configurable. For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel o r system reconfiguration may also be required. For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q19627 1). at sun.reflect.GeneratedConstructorAccessor8.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1 116) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2 370) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) at sun.reflect.GeneratedConstructorAccessor4.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :305) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at MyThread.run(thdd.java:26) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.net.BindException: Address already in use: connect at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) at java.net.AbstractPlainSocketImpl.connect(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.ja va:257) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294) ... 17 more com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The driver was unable t o create a connection due to an inability to establish the client portion of a s ocket. This is usually caused by a limit on the number of sockets imposed by the operat ing system. This limit is usually configurable. For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel o r system reconfiguration may also be required. For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q19627 1). at sun.reflect.GeneratedConstructorAccessor8.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1 116) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2 370) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) at sun.reflect.GeneratedConstructorAccessor4.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :305) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at MyThread.run(thdd.java:26) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.net.BindException: Address already in use: connect at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) at java.net.AbstractPlainSocketImpl.connect(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.ja va:257) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294) ... 17 more com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The driver was unable t o create a connection due to an inability to establish the client portion of a s ocket. This is usually caused by a limit on the number of sockets imposed by the operat ing system. This limit is usually configurable. For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel o r system reconfiguration may also be required. For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q19627 1). at sun.reflect.GeneratedConstructorAccessor8.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1 116) D:\Services>
修改源码,下面一段加上:
} finally { if (rs1 != null) try { rs1.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (statement1 != null) try { statement1.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (conn1 != null) try { conn1.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
问题依旧。
先是怀疑是mysql的问题,然后,我换了数据库,换成了sql server 2005
开始计数,总共运行了4502次,之后开始出现错误。
下面贴出我最终的代码,现在感觉有点乱,肯定有问题的,Java不可能是这样的。
import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import java.sql.*; public class thdd { public static void main(String[] args) throws InterruptedException { ExecutorService pool = Executors.newSingleThreadExecutor(); long count = 0; for (;;) { Thread.sleep(10); Thread t = new MyThread(); pool.execute(t); count++; System.out.println("第" + count + "次!"); } } } class MyThread extends Thread { public void run() { String driverName2 = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; String url = "jdbc:sqlserver://db.db.db;DatabaseName=test"; String user = "sa"; String password = "1234567890"; Connection conn = null; Statement st = null; ResultSet rs = null; try { Class.forName(driverName2).newInstance(); conn = DriverManager.getConnection(url, user, password); st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); String sql = "select * from t_test"; rs = st.executeQuery(sql); while (rs.next()) { Date now = new Date(); SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); System.out.println(format.format(now) + "\t" + rs.getString("ID") + "\t" + rs.getString("Name")); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (st != null) { st.close(); st = null; } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); conn = null; } } catch (SQLException e) { e.printStackTrace(); } finally { System.out.println("关闭成功!"); } } } } }
问题终于解决了:解决方法:
http://support.microsoft.com/kb/196271
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
值名称: MaxUserPort
值类型: DWORD
值数据: 65534
相关文章推荐
- Java系列之:看似简单的问题 静态方法和实例化方法的区别
- Java系列之:看似简单的问题 静态方法和实例化方法的区别
- Java- 简单了解线程 生产者与消费者问题(三)
- 一个简单的Java对象池实现——可用来解决SimpleDateFormat的线程安全问题
- 利用JAVA线程安全队列简单实现读者写者问题。
- Java- 简单了解线程 生产者与消费者问题(三)
- MySQL---数据库从入门走向大神系列(七)-Java访问数据库配置及简单使用方法execute
- java并发系列:一线程常见问题
- 1、简单排查java应用CPU飙高的线程问题
- Java系列之:看似简单的问题 静态方法和实例化方法的区别
- java + 线程系列之showThread(一)----简单的线程创建方式有两种
- java:线程的简单控制方法
- java线程 (一)生产者消费者模式-线程同步问题
- Java多线程系列--“基础篇”05之 线程等待与唤醒
- linux java线程100%的问题定位方法
- java高级多线程编程--关于线程的停止问题
- mysql-connector-java-6日期存储时差的问题解决方法
- java线程相关问题1
- Java 中文问题的解决 mysql, oracle, servlet, jsp
- java中简单的线程和委托事例