发表于: 2018-03-19 22:31:17

1 583


今天完成的事情:

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>
   <!--初始化的连接数,取值应在minPoolSizemaxPoolSize之间。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{
//通过读取C3P0xml配置文件创建数据源,C3P0xml配置文件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语句,实体类中的属性和gettersetter方法。需要的时间应该不多。

 

明天计划的事情:

完成任务一后续


遇到的问题:

对于打包还不太熟悉,经常打出来的包不能运行。还不太熟悉数据库连接池的各种配置。


收获:

学习了打包,数据库连接池的作用原理,trycatch捕获异常

进度:任务一步骤27

任务开始时间:3.10

预计demo时间:3.23

是否延期:

禅道地址:http://task.ptteng.com/zentao/project-task-562.html



返回列表 返回列表
评论

    分享到