问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用JAVA做sql脚本入数据库,文件有200M,200W条数据。使用exec()方法。报错误 Java heap space。

发布网友 发布时间:2022-04-10 01:10

我来回答

2个回答

懂视网 时间:2022-04-10 05:31

代码:RunSqlService:

 @Autowired
 private RunSqlDao runSqlDao;
 
 /**
 * 读取文件内容到SQL中执行
 * @param sqlPath SQL文件的路径:如:D:/TestProject/web/sql/脚本.Sql
 */
 public void runSqlByReadFileContent(String sqlPath) throws Exception {
 try {
  
  String sqlStr = readFileByLines(sqlPath);
  // System.out.println("获得的文本:" + sqlStr);
  if (sqlStr.length() > 0) {
  runSqlDao.runSqlBySqlStr(sqlStr);
  }
 } catch (Exception e) {
  e.printStackTrace();
  throw e;
 }
 }
 
 /**
 * 以行为单位读取文件,常用于读面向行的格式化文件
 */
 private String readFileByLines(String filePath) throws Exception {
 StringBuffer str = new StringBuffer();
 BufferedReader reader = null;
 try {
  reader = new BufferedReader(new InputStreamReader(
   new FileInputStream(filePath), "UTF-8"));
  String tempString = null;
  int line = 1;
  // 一次读入一行,直到读入null为文件结束
  while ((tempString = reader.readLine()) != null) {
  // 显示行号
  // System.out.println("line " + line + ": " + tempString);

  str = str.append(" " + tempString);
  line++;
  }
  reader.close();
 } catch (IOException e) {
  e.printStackTrace();
  throw e;
 } finally {
  if (reader != null) {
  try {
   reader.close();
  } catch (IOException e1) {
  }
  }
 }

 return str.toString();
 }

RunSqlDao :

 /**
 * @param sqlStr
 */
 public void runSqlBySqlStr(String sqlStr) {
 Map<String,Object> map=new HashMap<String,Object>();
 map.put("sqlStr", sqlStr);
 sqlSessionTemplate.selectList("runSql.runSqlBySqlStr", map);
 }

SQLMap:

<mapper namespace="runSql">

<select id="runSqlBySqlStr" parameterType="map">
<![CDATA[ ${sqlStr}]]>
</select>

</mapper>

这种写法:只支持数据的变化(新增、修改、删除),且SQL文件内容以begin开始,以end结束。无法更新表字段修改等操作。

方式二;使用ScriptRunner

代码:RunSqlService:

 /**
 * 执行sql脚本文件 使用ScriptRunner
 * @param sqlPath SQL文件的路径:如:D:/TestProject/web/sql/脚本.Sql
 */
 public void runSqlByScriptRunner(String sqlPath) throws Exception {
 try {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  Connection conn = sqlSession.getConnection();
  ScriptRunner runner = new ScriptRunner(conn);
  runner.setEscapeProcessing(false);
  runner.setSendFullScript(true);  
  runner.runScript(new InputStreamReader(new FileInputStream(sqlPath), "UTF-8"));
 } catch (Exception e) {
  e.printStackTrace();
  throw e;
 }
 }

这种写法:只能有一行SQL,即一次执行一个SQL语句,否则就会报错。

方式三:使用ScriptUtils
代码:RunSqlService:(以下两种方式:脚本.Sql 和RunSqlService 在同一目录下)

方法(1)

 /**
 * 执行sql脚本文件 使用Spring工具类
 */
 public void runSqlBySpringUtils() throws Exception {
 try {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  Connection conn = sqlSession.getConnection();
  ClassPathResource rc = new ClassPathResource("脚本.Sql", RunSqlDao.class);
  ScriptUtils.executeSqlScript(conn, rc);
 } catch (Exception e) {
  e.printStackTrace();
  throw e;
 }
 }

方法(2)

 /**
 * 执行sql脚本文件 使用Spring工具类
 */
 public void runSqlBySpringUtils() throws Exception {
 try {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  Connection conn = sqlSession.getConnection();
  ClassPathResource rc = new ClassPathResource("脚本.Sql", RunSqlDao.class);
  EncodedResource er = new EncodedResource(rc, "utf-8");
  ScriptUtils.executeSqlScript(conn, er);
 } catch (Exception e) {
  e.printStackTrace();
  throw e;
 }
 }

方法(1),脚本.Sql文件必须是ANSI的,否则执行到数据中汉字是乱码。

方法(2)解决了方法(1)的问题,完美了,喜欢的小伙伴们快拿去享用吧。

 

文章为本人原创,转载请标明出处。

Java执行SQL脚本文件到数据库

标签:span   font   常用   roc   parameter   family   append   reader   proc   

热心网友 时间:2022-04-10 02:39

StringBuffer支持很大的数据,你这才200M就内存溢出,显然是jvm内存分配不足。
1、调大jvn的内存。
2、修改程序,用缓存实现,不要一次全部读取出来。分次执行。追问调大内存,试了几次都没成功,有什么好方法没。我的是JAVA项目,右键去执行,不经过tomcat。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 监控器 人数 除了海康和大华之外还有哪些客流统计公司? 海康威视ids-2cd6810客流要服务器吗 实体店哪家客流统计软件好用? 监控摄像机能用作客流量分析吗 怎么换登录腾讯会员 腾讯视频会员怎么更改 怎么把sql 文件里的数据输入数据库,在java项目中运行成功? 为何现在的实习会计,薪资水平都普遍不高? 美图秀秀怎么工式P图 我在使用腾讯视频客户端看视频的时候一定会出现下面的情况,而导致看不了视频?怎么办? 会计行业一般工资多少? 会计工资能上5000吗? 上海市哪里有学汉堡炸鸡的培训学校? 哪里有正宗专业炸鸡汉堡培训 汉堡大学培训对象+培训内容+培训方式 我在小吃培训学习的汉堡,想找一个汉堡店实习一下经营模式。有没有? 学习炸鸡汉堡在店里打工好,还是去培训学习好么?大概学习多久呢,学会了开店大概的费用是多少? 汉堡奶茶培训哪里好 ? 想开家汉堡店,去哪里学习好,汉堡技术培训 支付宝账户名和绑定的手机号一样吗 我用QQ邮箱申请了支付宝没实名认证好像 用手机号申请 我用手机号码注册了支付宝账号,同时也用qq邮箱注册了支付宝账号,两个账号都绑定了同一张银行卡,实名 我的手机号支付宝账号和QQ邮箱支付宝账号怎么是2个分开的账号?不是一个账号。就是说打钱到QQ邮箱名 - 信息提示 我有两个支付宝账号,一个手机号申请,一个QQ邮箱申请,没法领到大红包,怎么办 我想问问支付宝不是分qq邮箱绑定和手机绑定吗,那么是不是如果我的支付宝账号是手机号就是用手机绑定的 以前用qq邮箱注册了一个支付宝账号现在想用手机号注册一个行么不用以前那个行么 怎样做白胡椒泡面好吃 白胡椒面是什么东东?和白胡椒粉不一样的吗? 胡椒面有啥作用 胡椒粉有的人叫胡椒面,这是为什么呢? 黑白胡椒粉有什么区别 寄快递要带啥子啊? 如何安装小插件? 三星手机如何安装桌面小插件 联想k3手机桌面小插件如何安装 请教高手,罗克韦尔变频器可以直接改变频参数来加大电机力矩输出?改哪个参数呢其它变频器有类似的功能吗 七夕,给女朋友送什么东西大家都说说 如何将罗克韦尔755变频器参数复制到另一台变频器 罗克韦尔PLC的PFx525变频器怎么编程,有程序但是看不懂,具体哪位可以帮助