Java 我在建立连接时遇到空指针异常
在这里,我使用jdbcHelper来建立与数据库的连接,但有时(并非所有时候)我会在连接建立过程中得到异常作为空指针,但并非所有时候都是这样。 这是我的代码。此代码用于将数据插入数据库Java 我在建立连接时遇到空指针异常,java,jdbc,Java,Jdbc,在这里,我使用jdbcHelper来建立与数据库的连接,但有时(并非所有时候)我会在连接建立过程中得到异常作为空指针,但并非所有时候都是这样。 这是我的代码。此代码用于将数据插入数据库 Connection conn = JDBCHelper.getConnection(); PreparedStatement ps1 = null; System.out.println("In Side DATA BASE"); System.out.prin
Connection conn = JDBCHelper.getConnection();
PreparedStatement ps1 = null;
System.out.println("In Side DATA BASE");
System.out.println("in side database deviceid=" + s);
System.out.println("in side database rfide=" + s1);
System.out.println("in side database longitude=" + lati);
System.out.println("in side database latitude= " + lot);
System.out.println("in side database datalength=" + data_length);
Date date = new Date();
java.sql.Timestamp dt = new java.sql.Timestamp(date.getTime());
int flag = 1;
System.out.println("date=" + dt);
System.out.println("flag=" + flag);
try {
String hql = "insert into gpsData1(dateTime,deviceid,latitude,longitude,rfid,flag,datalength) values(?,?,?,?,?,?,?)";
ps1 = conn.prepareStatement(hql);
ps1.setString(1, dt.toString());
ps1.setString(2, s);
ps1.setFloat(3, lati);
ps1.setFloat(4, lot);
ps1.setString(5, s1);
ps1.setInt(6, flag);
ps1.setInt(7, data_length);
ps1.executeUpdate();
conn.commit();
System.out.println("DATA BASE Inserting Completed");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
JDBCHelper.close(ps1);
JDBCHelper.close(conn);
}
这是我的JDBC代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCHelper {
public static final String url = "jdbc:mysql://localhost:3306/treamisdemo";
public static final String uid = "root";
public static final String pwd = "myserver";
/**
* @param
* args
*/
static {
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("connection is sucessful");
} catch (ClassNotFoundException e) {
System.err.println("ERROR: failed to load mysql JDBC driver.");
e.printStackTrace();
}
}
public static void close(ResultSet c) {
try {
if (c != null) {
c.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement c) {
try {
if (c != null) {
c.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection c) {
try {
if (c != null) {
c.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection con = null;
try {
con = DriverManager.getConnection(url, uid, pwd);
System.out.println("obtain connection =" + con);
con.setAutoCommit(false);
return con;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
}
这是堆栈跟踪
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data sourc
e rejected establishment of connection, message from server: "Too many connecti
ons"
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
orAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
onstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
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:1013)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1128)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2336)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2
369)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.GeneratedConstructorAccessor39.newInstance(Unknown Source
)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
onstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
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(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:215)
at com.treamis.transport.vehicle.JDBCHelper.getConnection(JDBCHelper.jav
a:71)
at com.treamis.transport.vehicle.MyTimerTask.getRoutePointList(MyTimerTa
sk.java:639)
at com.treamis.transport.vehicle.MyTimerTask.sendSms(MyTimerTask.java:10
8)
at com.treamis.transport.vehicle.MyTimerTask.run(MyTimerTask.java:71)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:数据源
e拒绝建立连接,来自服务器的消息:“连接太多”
ons“
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
orAccessorImpl.java:57)
在sun.reflect.delegatingConstructor或AccessorImpl.newInstance(DelegatingC
onstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:526)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:411)
位于com.mysql.jdbc.Util.getInstance(Util.java:386)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1013)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
位于com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1128)
位于com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2336)
位于com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2
369)
位于com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153)
位于com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:792)
位于com.mysql.jdbc.JDBC4Connection(JDBC4Connection.java:47)
在sun.reflect.GeneratedConstructorAccessor39.newInstance(未知源
)
在sun.reflect.delegatingConstructor或AccessorImpl.newInstance(DelegatingC
onstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:526)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:411)
位于com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
位于com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java
:305)
位于java.sql.DriverManager.getConnection(DriverManager.java:571)
位于java.sql.DriverManager.getConnection(DriverManager.java:215)
在com.treamis.transport.vehicle.JDBCHelper.getConnection(JDBCHelper.jav)上
a:71)
在com.treamis.transport.vehicle.MyTimerTask.getRoutePointList(MyTimerTa)上
sk.java:639)
在com.treamis.transport.vehicle.MyTimerTask.sendSms(MyTimerTask.java:10
8)
位于com.treamis.transport.vehicle.MyTimerTask.run(MyTimerTask.java:71)
位于java.util.TimerThread.mainLoop(Timer.java:555)
在java.util.TimerThread.run(Timer.java:505)
异常状态为:“连接太多”
您必须在使用完每个连接后关闭它
有时,您没有关闭打开的连接。您应该在try块中移动getConnection
call,以便在finally语句中始终关闭if
另一个可能的原因是您试图同时连接太多次
建议:
应仅在需要时打开连接。无需在函数开始时立即打开它李>
您得到的NPE是因为getConnection()
错误时返回null。我认为在这种情况下最好抛出一个异常,而不是返回null
如果您使用Java7,则可以在使用完资源后使用关闭它们
确保使用合理数量的DB连接。如果您需要更多的可用连接,请考虑使用一个连接来访问所有的数据库访问。
异常状态为:“连接太多”
您必须在使用完每个连接后关闭它
有时,您没有关闭打开的连接。您应该在try块中移动getConnection
call,以便在finally语句中始终关闭if
另一个可能的原因是您试图同时连接太多次
建议:
应仅在需要时打开连接。无需在函数开始时立即打开它李>
您得到的NPE是因为getConnection()
错误时返回null。我认为在这种情况下最好抛出一个异常,而不是返回null
如果您使用Java7,则可以在使用完资源后使用关闭它们
确保使用合理数量的DB连接。如果您需要更多的可用连接,请考虑使用一个连接来访问所有的数据库访问。
此计时器任务可以使用单个连接。更新成功时提交,但不要关闭连接,请重新使用连接
大概是这样的:
boolean doInsert(){
// your insert code
// String hql = "insert into gpsData1(dateTime,deviceid,latitude,longitude,rfid
return ps1.executeUpdate(); // this returns true or false
}
boolean isInsert = doInsert();
if(isInsert){
conn.commit();
}
此计时器任务可以使用单个连接。更新成功时提交,但不要关闭连接,请重新使用连接
大概是这样的:
boolean doInsert(){
// your insert code
// String hql = "insert into gpsData1(dateTime,deviceid,latitude,longitude,rfid
return ps1.executeUpdate(); // this returns true or false
}
boolean isInsert = doInsert();
if(isInsert){
conn.commit();
}
使用像或这样的真实连接池。使用像或这样的真实连接池。NPE在哪一行抛出?你能将stackTrace粘贴到这里吗?我已经发布了堆栈跟踪,请看..thanksI打赌NPE在这一行:PreparedStatement psmt=conn.prepareStatement(hql)代码>。“getConnection()”方法似乎会导致异常,然后在打印堆栈跟踪后返回null。如果是这种情况,OP应该发布堆栈跟踪的打印输出。看起来,问题可能有很多:DB不能接受更多的连接,网络问题,等。是的,只有在那个地方我得到了空指针表达式。.NPE抛出在哪一行?你能在这里粘贴stackTrace吗?我已经发布了我的堆栈跟踪,请查看。.thanksI打赌NPE在这一行:PreparedStatement psmt=conn.prepareStatement(hql)代码>。“getConnection()”方法似乎是