发表于: 2018-04-25 19:27:12
1 552
今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)
明天计划的事情:(一定要写非常细致的内容)
遇到的问题:(遇到什么困难,怎么解决的)
收获:(通过今天的学习,学到了什么知识)
今天完成的事情:1.在服务器上跑通main方法
首先先在本地cmd下证明在本机环境下能运行起来:
然而事实证明不存在本地行 服务器就一定行的道理:1.提示高版本的java project使用了低版本的来运行 2.url配置出错
于是我查了上次在centos里装的jdk版本:其实是因为当初1.8环境变量没配好(用win版去装能配对就怪了 实际应该下linux版的),才装了1.7的
去idea里面把project sdk 和language level调低
还要把pom.xml里的一个compiler插件里面的Java版本1.8改为1.7(贼坑 调了半天)
具体的解释:Compiler插件设置要编译的Java源代码兼容的JVM版本和编译后的类库拟运行的JVM版本通过设置Java源代码兼容的JVM版本,标明Java源代码开发过程中使用的Java版本。通过设置编译后的类库拟运行的JVM版本,给出编译后的类库将要运行的Java环境
跑通
PropertyConfigurator.configure("G:\\StudentMabatisTest\\src\\log4j.properties");
2.log4j.properties文件里面的日志输出位置需要改动 我改成了服务器里面的具体路径发现并没有用 网上查说貌似是要用log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)待解决
log4j.appender.Console.File=g://log4j/src/example.log
2. 测试一下不关闭连接池的时候,在Main函数里写1000个循环调用会出现什么情况
连接池是什么,有什么作用?
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
也有一些开源组织提供了数据源的独立实现:
- DBCP 数据库连接池
- C3P0 数据库连接池
在使用了数据库连接池之后,在项目的实际开发中就不需要编写连接数据库的代码了,直接从数据源获得数据库的连接。
public class ConnectionPoolTest {
static org.slf4j.Logger logger = LoggerFactory.getLogger(ConnectionPoolTest.class);
public static void main(String[] args) throws Exception {
PropertyConfigurator.configure("G:\\StudentMabatisTest\\src\\log4j.properties");
Connection connection =null;
PreparedStatement preparedStatement =null;
for (int i =6;i<1000;i++){
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/enrolment?useSSL=false","root","19971015");
connection.setAutoCommit(false);//想在一个事务里进行多个操作,在多个操作的最后调用conn.commit()方法,进行手动提交。
preparedStatement = connection.prepareStatement("INSERT INTO people VALUES (?,?,?)");
preparedStatement.setInt(1,i);
preparedStatement.setString(2,"陈独秀");
preparedStatement.setString(3,"男");
preparedStatement.executeUpdate();
connection.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){ //这里需要注释掉,来实现未关闭连接池
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
这样的话,如果,你想在一个事务里进行多个操作。就必然将setAutoCommit的参数设置成false,在多个操作的最后调用conn.commit()方法,进行手动提交。
来一段网上的举例:
有时候是很必要的,特别是纯JDBC的事务控制,就更需要了,举个例子来说吧,你要删除某个部门,而该部门下又有多个员工,这时候,你就得先删除该部门下的所有员工,这里,你就得把两个操作(删除员工和删除部门)放在同一个业务中了,而这种情况下是很危险的,你可能成功删除了该部门下的所有员工而删除该部门的时候又遇到了异常即没有成功删除。这时候,如果你原先没有把事务提交方式改为手工提交,而之前删除的员工的事务又已经自动提交了,就无法进行数据回滚,员工的数据就找不回了,这时,你会45度仰望天空,感叹一声:“啊,悲剧终于发生了”
出现数据源拒绝建立太多连接的错误,去数据库看发现并没有插入994条语句,只插了367条:中间出现了两次跳跃。不是很清楚这个机制是什么
关闭连接池
没有错误,插入了994条数据
明天计划的事情:1.学习连接池?
2.完成任务26 27 或26 27 28
- 26.测试一下连接DB中断后TryCatch是否能正常处理。
- 27.检查一下自己的代码是否符合规范,如果DB的表格有改动,应该改哪些内容,需要多久。
- 28.数据库里插入100万条数据,对比建索引和不建索引的效率查别。再插入3000万条数据,然后是2亿条,别说话,用心去感受数据库的性能。
问题: 1.log4j配置问题
2.为什么连接池未关闭会出现上面这个情况?
收获:1.学会了在服务器上跑通流程
2.了解数据库连接到一定程度时就会无法创建连接,每个连接都是昂贵的有限资源,需要连接池概念的引入。
评论