簡體   English   中英

我在連接建立中得到空指針異常

[英]I am getting null pointer exception in connection establishment

這里我使用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)

例外情況: "Too many connections"

完成使用后,必須關閉每個連接。

有時您不會關閉打開的連接。 您應該在try塊中移動getConnection調用,這樣如果在finally語句中,您將始終關閉。

另一個可能的原因是您嘗試同時連接太多次。

建議:

  1. 只有在需要時才應打開連接。 無需在功能開始時立即打開它。
  2. 你得到的NPE是因為getConnection()在出錯時返回null。 我認為最好在這種情況下拋出異常而不是返回null。
  3. 如果使用Java 7,則可以在完成使用后使用try-with-resources關閉資源。
  4. 確保使用合理數量的數據庫連接。 如果您需要的連接多於可用連接,請考慮為所有數據庫訪問使用一個連接。

您可以為此Timer任務使用單個連接。 提交成功更新但不要關閉連接,重用它。

像這樣的東西:

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();
}   

使用像HikariCPBoneCP這樣的真實連接池。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM