因为公司舍不得请DBA,又是门户类型的网站,导致最近老因为数据库归档、备份导致的磁盘空间已满等等各种的问题而导致访问失败。
  所以写了一个小小的监测程序。后台写了一个Thread,每五分钟,就去链接一次数据库,看数据库是否正常着。
  代码如下:
主要代码如下:
public boolean checkDBStatus(ci.adp.DataRow row){
boolean result = false; 
String serName = row.getValueStr("SERNAME"); 
String classForNameStr = row.getValueStr("DBDRIVER");
String connStr = row.getValueStr("DBCONN");
String username = row.getValueStr("DBUSER");
String password = row.getValueStr("DBPWD");
try { /**/
Class.forName(classForNameStr).newInstance();
java.sql.Connection conn =  DriverManager.getConnection(connStr,username, password);  
conn.close(); 
result = true;
} catch (Exception e) { 
sendMail("数据库访问异常",serName+"数据库访问异常,请及时检查.["+e.getMessage()+"]"); 
}
return result;
}
大概调用到第七次的时候,出现下面异常:
Exception in thread "Thread-12" java.lang.IllegalAccessError: class sun.reflect.GeneratedConstructorAccessor43 cannot access its superclass sun.reflect.ConstructorAccessorImpl
at sun.misc.Unsafe.defineClass(Native Method)
at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:45)
at sun.reflect.MethodAccessorGenerator$1.run(MethodAccessorGenerator.java:381)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:377)
at sun.reflect.MethodAccessorGenerator.generateConstructor(MethodAccessorGenerator.java:76)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:30)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at oracle.net.ano.Service.h(Service)
at oracle.net.ano.SupervisorService.a(SupervisorService)
at oracle.net.ano.Ano.e(Ano)
at oracle.net.ano.Ano.init(Ano)
at oracle.net.ns.NSProtocol.connect(Unknown Source)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:856)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:268)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:439)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at ut.asc.CheckDomain.checkDBStatus(CheckDomain.java:137)
at ut.asc.CheckDomain.checkListenSer(CheckDomain.java:87)
at ci.filter.ASCThread.run(ASCListener.java:62)把下面代码注释以后,运行正常,可以确定不是Thread 引起的。
Class.forName(classForNameStr).newInstance();
java.sql.Connection conn =  DriverManager.getConnection(connStr,username, password);  
conn.close(); 各位大侠,有什么好的方式可以解决。