Can';使用java在sqlite数据库中插入超过254个数据
我正在使用一个java类,它允许我将数据从字符串插入SQLite数据库。我通过循环插入数据。我的字符串有260个数据。当我尝试将这些数据从字符串插入sqlite数据库时,它工作正常,但每次都会停在254的位置!为什么Can';使用java在sqlite数据库中插入超过254个数据,java,windows,sqlite,netbeans,netbeans-8,Java,Windows,Sqlite,Netbeans,Netbeans 8,我正在使用一个java类,它允许我将数据从字符串插入SQLite数据库。我通过循环插入数据。我的字符串有260个数据。当我尝试将这些数据从字符串插入sqlite数据库时,它工作正常,但每次都会停在254的位置!为什么 for(i = 0; i < 260; i++) { try { Class.forName("org.sqlite.JDBC"); connection = DriverManager.getConne
for(i = 0; i < 260; i++)
{
try {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:D:\\new.db");
java.sql.Statement statement = connection.createStatement();
statement .executeUpdate("INSERT INTO suggestion (suggesting) VALUES('"+words[i]+"')");
System.out.println(i + " - " + words[i]);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Word.class.getName()).log(Level.SEVERE, null, ex);
}
}
(i=0;i<260;i++)的
{
试一试{
Class.forName(“org.sqlite.JDBC”);
connection=DriverManager.getConnection(“jdbc:sqlite:D:\\new.db”);
java.sql.Statement Statement=connection.createStatement();
语句.executeUpdate(“插入建议值(“+”字[i]+”)”);
System.out.println(i+“-”+字[i]);
}捕获(ClassNotFoundException ex){
Logger.getLogger(Word.class.getName()).log(Level.SEVERE,null,ex);
}
}
这是netbeans的错误日志
Exception in thread "main" java.lang.NullPointerException
at org.sqlite.NestedDB$CausedSQLException.fillInStackTrace(NestedDB.java:442)
at java.lang.Throwable.<init>(Throwable.java:250)
at java.lang.Exception.<init>(Exception.java:54)
at java.sql.SQLException.<init>(SQLException.java:140)
at org.sqlite.NestedDB$CausedSQLException.<init>(NestedDB.java:435)
at org.sqlite.NestedDB._open(NestedDB.java:63)
at org.sqlite.DB.open(DB.java:77)
at org.sqlite.Conn.<init>(Conn.java:88)
at org.sqlite.JDBC.connect(JDBC.java:64)
at java.sql.DriverManager.getConnection(DriverManager.java:571)
at java.sql.DriverManager.getConnection(DriverManager.java:233)
at test.Word.main(Word.java:106)
Java Result: 1
线程“main”java.lang.NullPointerException中的异常
位于org.sqlite.NestedDB$CausedSQLException.fillInStackTrace(NestedDB.java:442)
位于java.lang.Throwable。(Throwable.java:250)
位于java.lang.Exception。(Exception.java:54)
位于java.sql.SQLException.(SQLException.java:140)
位于org.sqlite.NestedDB$CausedSQLException。(NestedDB.java:435)
位于org.sqlite.NestedDB.\u open(NestedDB.java:63)
位于org.sqlite.DB.open(DB.java:77)
位于org.sqlite.Conn.(Conn.java:88)
位于org.sqlite.JDBC.connect(JDBC.java:64)
位于java.sql.DriverManager.getConnection(DriverManager.java:571)
位于java.sql.DriverManager.getConnection(DriverManager.java:233)
at test.Word.main(Word.java:106)
Java结果:1
您可能正在耗尽连接,因为在打开新连接之前,您没有按要求关闭它们。连接耗尽不应引发
NullPointerException
;这似乎是sqlite中的一个bug
更好更快的方法是:不要关闭连接,但不要每次都打开一个新连接
您可以这样做:
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException ex) {
Logger.getLogger(Word.class.getName()).log(Level.SEVERE, null, ex);
}
connection = DriverManager.getConnection("jdbc:sqlite:D:\\new.db");
for(i = 0; i < 260; i++)
{
java.sql.Statement statement = connection.createStatement();
try {
statement.executeUpdate("INSERT INTO suggestion (suggesting) VALUES('"+words[i]+"')");
} finally {
// Statements, like connections, also need to be closed after use
statement.close();
}
System.out.println(i + " - " + words[i]);
}
试试看{
Class.forName(“org.sqlite.JDBC”);
}捕获(ClassNotFoundException ex){
Logger.getLogger(Word.class.getName()).log(Level.SEVERE,null,ex);
}
connection=DriverManager.getConnection(“jdbc:sqlite:D:\\new.db”);
对于(i=0;i<260;i++)
{
java.sql.Statement Statement=connection.createStatement();
试一试{
语句.executeUpdate(“插入建议值(“+”字[i]+”)”);
}最后{
//语句(如连接)也需要在使用后关闭
语句。close();
}
System.out.println(i+“-”+字[i]);
}
这里有一个可能会有所帮助的重新分解和更新
我假设SQLite驱动程序不喜欢您在使用连接后不关闭连接(实际的NullPointer
可能是您正在使用的库中的一个bug)
我还添加了PreparedStatement
(这对SQL注入攻击来说效率更高,风险更小)以及正确关闭资源(在Java7之前,当然要尝试使用资源)
希望这能有所帮助。您确定数组中的值有效吗?我无法对空指针进行注释,只能假设驱动程序拒绝创建另一个连接,因为您一直在创建连接,并且从未关闭任何连接。。上面的代码非常需要重新分解以使用准备好的语句、单个连接和正确的错误检查。非常感谢!:我已经通过循环创建了很多连接!现在解决了!
Connection connection = null;
PreparedStatement insert = null;
try {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:D:\\new.db");
insert = connection.prepareStatement("INSERT INTO suggestion (suggesting) VALUES(?)");
for (String word : words) {
insert.setString(1, word);
System.out.println("Word "+word+" inserted");
}
} catch (ClassNotFoundException ex) {
Logger.getLogger(Word.class.getName()).log(Level.SEVERE, "Driver not found", ex);
} catch (SQLException sqle) {
Logger.getLogger(Word.class.getName()).log(Level.SEVERE, "Could not execute SQL", sqle);
} finally {
if (insert != null) {
try {
insert.close();
} catch (SQLException sqle) {
Logger.getLogger(Word.class.getName()).log(Level.SEVERE, "Could not close prepared statement", sqle);
}
insert = null;
}
if (connection != null) {
try {
connection.close();
} catch (SQLException sqle) {
Logger.getLogger(Word.class.getName()).log(Level.SEVERE, "Could not close connection", sqle);
}
connection = null;
}
}