发表于: 2018-03-19 22:31:17
1 580
今天完成的事情:
24.直接执行Main方法,去在服务器上跑通流程。
方法一:
写了一个简单的程序,我用IDEA打包的方式是在POM文件中加了如下插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<useUniqueVersions>false</useUniqueVersions>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>cn.mymaven.test.TestMain</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
然后再将jar包拖到服务器上,运行Java -jar TestDemo1-1.0-SNAPSHOT.jar
结果为,解决了之前的找不到主程序清单的异常
maven-compiler-plugin 插件用于指定项目源码的jdk版本,编译后的jdk版本,以及编码,避免编译不通过的问题:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.70</version>
<configuration>
<source>1.6</source> <!-- 源代码使用的开发版本 -->
<target>1.6</target> <!-- 需要生成的目标class文件的编译版本 -->
<encoding>UTF8</encoding><!--编码-->
</configuration>
</plugin>
maven-jar-plugin:打包插件,设定manifest(显示)的参数,比如指定运行的Main class,还有依赖的jar包,加入classpath中
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<!-- 生成MANIFEST.MF的设置 -->
<manifest>
<!-- 为依赖包添加路径, 这些路径会写在MANIFEST文件的Class-Path下 -->
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<!-- jar启动入口类-->
<mainClass>com.ycc.model.Main</mainClass>
</manifest>
<manifestEntries>
<!-- 在Class-Path下添加配置文件的路径 -->
<Class-Path>conf/</Class-Path>
</manifestEntries>
</archive>
<includes>
<!-- 打jar包时,只打包class文件 -->
<include>**/*.class</include>
</includes>
</configuration>
</plugin>
而当我不用插件,只用mvn默认的打包,在到服务器上运行就会显示如下信息:
原因是:正常情况下,java打包成jar包需要在MANIFEST.MF中指定Main-Class(注意:Main-Class:后面应该有一个空格;而且最后一行也要有一个回车键)项以便运行java -jar XXX.jar时找到对应的主类。因为-jar的含义就是后面跟的jar包是有main class可独立运行,所以需要在打包成jar包时指定这个类。
如果想运行时指定想要运行的类,此时应该用-cp / --classpath来指定,
命令如下:
java -cp XXX.jar com.HelloWorld
方法二:
另外还有一种方法,就是用idea来打包,快捷键shift+ctrl+alt+s 呼出如下界面:
弹出如下信息:1:将把第三方jar文件,打入最终的可运行jar包
2:这个没搜到,推测就是不把依赖打入jar包内把
最后如下:build 即可
25.测试一下不关闭连接池的时候,在Main函数里写1000个循环调用会出现什么情况。
jdbc配置了c3p0连接池,
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb</property>
<property name="user">root</property>
<property name="password">root</property>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default:3 -->
<property name="acquireIncrement">5</property>
<!--初始化的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3-->
<property name="initialPoolSize">10</property>
<!--连接池中保留的最小连接数-->
<property name="minPoolSize">5</property>
<!--连接池中保留的最大连接数。Default:15 -->
<property name="maxPoolSize">20</property>
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts">30</property>
<!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
<property name="acquireRetryDelay">1000</property>
<!--连接关闭时默认将所有未提交的操作回滚。Default: false -->
<property name="autoCommitOnClose">false</property>
</default-config>
然后写了个工具类用来控制连接池的开关
public class JdbcUtils_C3P0 {
private static ComboPooledDataSource ds=null;
static{
try{
//通过读取C3P0的xml配置文件创建数据源,C3P0的xml配置文件c3p0-config.xml必须放在src目录下
//使用C3P0的默认配置来创建数据源
ds = new ComboPooledDataSource();
}catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
//从数据源中获取数据库连接
public static Connection getConnection()throws SQLException {
//从数据源中获取数据库连接
return ds.getConnection();
}
//释放链接
public static void release(Connection conn){
if(conn!=null){
try{
//将Connection连接对象还给数据库连接池
conn.close();
}catch (Exception e) {
e.printStackTrace();
}}}}
然后再测试,在循环中反复调用数据库的连接(DB连接池不关闭),由于设置的最大值为20,当连接数大于20的时候程序会卡住,需要更改最大连接数。
public class Demo {
public static void main(String[] args)throws Exception {
Connection conn = null;
PreparedStatement ps = null;
long start = 0;
long end = 0;
for (int i=0;i<1000;i++) {
try {
// start = System.currentTimeMillis();
conn = JdbcUtils_C3P0.getConnection();
ps = conn.prepareStatement("insert into users values(?,?,?)");
ps.setInt(1, i+1);
ps.setString(2, "张三" + i);
ps.setLong(3, 22);
System.out.println(ps.executeUpdate()+"------------------"+(i+1));
// end = System.currentTimeMillis();
} catch (Exception e) {
e.printStackTrace();
} finally {
// JdbcUtils_C3P0.release(conn);
// System.out.println("用时:::::" + (end - start));
}
}
}
}
26.测试一下连接DB中断后TryCatch是否能正常处理
如下图,在程序运行中将DB连接关闭
结果:可以正常捕获异常
27.检查一下自己的代码是否符合规范,如果DB的表格有改动,应该改哪些内容,需要多久。
一般来说,如果表格的内容有变动,那么只需要改映射文件或者映射接口中的sql语句,实体类中的属性和getter,setter方法。需要的时间应该不多。
明天计划的事情:
完成任务一后续
遇到的问题:
对于打包还不太熟悉,经常打出来的包不能运行。还不太熟悉数据库连接池的各种配置。
收获:
学习了打包,数据库连接池的作用原理,trycatch捕获异常
进度:任务一步骤27
任务开始时间:3.10
预计demo时间:3.23
是否延期:否
禅道地址:http://task.ptteng.com/zentao/project-task-562.html
评论