2013-10-04 70 views
3

我写依赖数据库不可能初始化

我尝试检查,如果许多用户尝试注册一次 会发生什么,我才能从数据库中获取的对象使用GSON的web应用程序

如果我一次注册50个用户(通过产生新的线程),一切都很好 但如果我尝试注册100或更多,我得到2个例外,一个说我有太多的连接打开,另一个说未能加载gson类

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections" 
at sun.reflect.GeneratedConstructorAccessor13.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.Util.getInstance(Util.java:386) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1014) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974) 
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1110) 
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2465) 
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2498) 
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283) 
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:822) 
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 
at sun.reflect.GeneratedConstructorAccessor1.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
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:404) 
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317) 
at java.sql.DriverManager.getConnection(Unknown Source) 
at java.sql.DriverManager.getConnection(Unknown Source) 
at com.database.Database.openDatabase(Database.java:229) 
at com.database.Database.log(Database.java:253) 
at com.electronicarena.utils.Log.debug(Log.java:54) 
at com.electronicarena.utils.Log.info(Log.java:68) 
at com.database.Database.findAll(Database.java:434) 
at com.database.Database.find(Database.java:490) 
at com.database.Database.find(Database.java:514) 
at com.database.adapters.UserAdapter.getUserByLoginName(UserAdapter.java:53) 
at com.database.adapters.UserAdapter.isUserExist(UserAdapter.java:41) 
at com.database.adapters.UserAdapter.register(UserAdapter.java:173) 
at com.lenabru.webservice.ElectronicArenaWebService.memberRegister(ElectronicArenaWebService.java:65) 
at test.UserAdapterTest$UserThread.run(UserAdapterTest.java:168) 



Exception in thread "Thread-87" java.lang.NoClassDefFoundError: Could not initialize class com.electronicarena.utils.EAGson 
at com.database.DatabaseObject.get(DatabaseObject.java:299) 
at com.database.DatabaseObject.set(DatabaseObject.java:365) 
at com.database.DatabaseObject.set(DatabaseObject.java:337) 
at com.database.DatabaseObject.getFindByKeysPreparedStatement(DatabaseObject.java:97) 
at com.database.Database.findAll(Database.java:435) 
at com.database.Database.find(Database.java:490) 
at com.database.Database.find(Database.java:514) 
at com.database.adapters.UserAdapter.getUserByLoginName(UserAdapter.java:53) 
at com.database.adapters.UserAdapter.isUserExist(UserAdapter.java:41) 
at com.database.adapters.UserAdapter.register(UserAdapter.java:173) 
at com.lenabru.webservice.ElectronicArenaWebService.memberRegister(ElectronicArenaWebService.java:65) 
at test.UserAdapterTest$UserThread.run(UserAdapterTest.java:168) 

这是我插入用户到数据库

public int insert(DatabaseObject object) { 
    int dbEntry = -1; 
    Connection con = null; 
    PreparedStatement statement = null; 
    String sql = null; 
    try { 
     Log.info("inserting object: " + object); 
     con = openDatabase(); 
     statement = object.getInsertPreparedStatement(con); 
     sql = statement.toString(); 
     dbEntry = statement.executeUpdate(); 
     Log.info("dbEntry: " + dbEntry); 
    } catch (SQLException e) { 
     Log.error("failed to insert object " + object + " into database ", e); 
    } finally { 

     close(null, statement, con); 
     backupSQL(sql); 
    } 
    return dbEntry; 
    } 

代码,这是我对GSON类代码

public static JSONObject toJsonObject(Object o) { 
    Log.info(o); 
    JSONObject result = null; 
    try { 
     String jsonString = toJson(o); 
     result = new JSONObject(jsonString); 
    } catch (JSONException e) { 
     Log.warning("toJSonObject failed '" + o + "'",e); 
    } 
    return result; 
} 

我能做些什么,以避免“太多打开的连接“错误,为什么我得到第二个错误? 类本来是要一次初始化,并且throught该应用

回答

1

首先问题

上的分贝连接的数量将总是限于(至少DB服务器上RAM)使用,以便:

  1. 增加连接到100的数字,如果如果有足够多的测试这个数,但是这会消耗服务器上或(更好)
  2. 使用连接池来管理服务器连接更多的资源,这是最好的解决罪恶ce连接将被重用,并且您可以尝试每次编号进行测试。您可以在网络上找到许多随时可用的解决方案。例如,请参见here

问题二

com.electronicarena.utils.EAGson类不是Java所在预计将。与Gson本身没有任何关系。所以你必须检查你的PATH变量。如果您正在使用Eclipse,则可能是该类未编译,或者您必须检查项目首选项的“部署”部分。