Java-JDBC的大数据量的存储

发布于 2017-02-06 10:44:00 字数 3413 浏览 1285 评论 2

我想编写一个程序,使用键盘输入流,接收一段大文本数据,并将这些数据保存在数据表中。
代码如下:

package jdbc;

import java.io.InputStream;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class BigDataJDBC {
public static final String DBDRIVER="org.gjt.mm.mysql.Driver";
public static final String DBURL="jdbc:mysql://localhost:3306/test";
public static final String DBUSER="root";
public static final String DBPASSWORD="123";
private static Connection conn;
private static PreparedStatement pstmt;
private static ResultSet rs;
public static boolean getConnection(){
try{
Class.forName(DBDRIVER);
conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
return true;
}catch(Exception e){
return false;
}
}
public static boolean insertDB(int id,InputStream input,int length,String address){
String sql="insert into bigdata(id,contents,picture) values(?,?,?)";

try{

pstmt=conn.prepareStatement(sql);

pstmt.setInt(1,id);
pstmt.setString(3,address);
pstmt.setAsciiStream(2,input,length);

pstmt.executeUpdate();
System.out.println(length);
pstmt.close();
return true;
}catch(Exception e){
return false;
}
}
public static String getInfo(int key,StringBuffer address){
String sql="select contents,picture from bigdata where id=?";
try{
pstmt=conn.prepareStatement(sql);
pstmt.setInt(1,key);
rs=pstmt.executeQuery();
if(rs.next()){
Clob contents=rs.getClob(1);
address.append(rs.getString(2));
String content=contents.getSubString(1,(int)contents.length());
rs.close();
pstmt.close();
return content;
}
else{
rs.close();
pstmt.close();
return "NOT FIND!";
}
}catch(Exception e){
return "ERROR!";
}
}
public static boolean close(){
try{
conn.close();
return true;
}catch(Exception e){
return false;
}
}

}
package test;

import java.io.IOException;

public class BigDataTest {

public static void main(String[] args) throws IOException{
BigDataJDBC.getConnection();
InputStream inputContent=System.in;
int temp=0;
int length=0;
while((temp=inputContent.read())!=-1){
length++;
char c=(char)temp;
if(c=='#'){
break;
}
}
if(BigDataJDBC.insertDB(1, inputContent, length, "abc")){
System.out.println("OK!");
}
else{
System.out.println("FALSE!");
}
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浮生未歇 2017-08-17 22:46:17

楼主,你处理InputStream的方式不对。
while((temp=inputContent.read())!=-1){
length++;
char c=(char)temp;
if(c=='#'){
break;
}
}
这段代码执行结束后,InputStream已经到了输入流的末尾'#'处,这时候再通过JDBC写入数据库已经没有意义了。
推荐使用BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 这种方式来从键盘接收数据。
另外楼上说的对,异常信息应该要打印出来,而不是直接return false。

浮生未歇 2017-06-18 03:10:20

我觉得你代码哪里错了不重要,但是你的代码里有个很严重的问题:

catch(Exception e){
return false;
}

这种方式叫做吃异常,而且你这里把异常吃的干干净净,一点信息都不输出来,即使是错误了,你自己都找不到问题在哪里。
你把所以的这样的代码改为:

 catch(Exception e){
e.printStack();
return false;
}

看看报什么错。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文