Java 我在建立连接时遇到空指针异常

Java 我在建立连接时遇到空指针异常,java,jdbc,Java,Jdbc,在这里,我使用jdbcHelper来建立与数据库的连接,但有时(并非所有时候)我会在连接建立过程中得到异常作为空指针,但并非所有时候都是这样。 这是我的代码。此代码用于将数据插入数据库 Connection conn = JDBCHelper.getConnection(); PreparedStatement ps1 = null; System.out.println("In Side DATA BASE"); System.out.prin

在这里,我使用jdbcHelper来建立与数据库的连接,但有时(并非所有时候)我会在连接建立过程中得到异常作为空指针,但并非所有时候都是这样。 这是我的代码。此代码用于将数据插入数据库

 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()”方法似乎是