当在SpringBoot使用Redis的Session共享功能时,@EnableScheduling始终生效的问题。

我在调试项目的redis共享时,遇到了这种情况:

当我需要使用Redis来管理SpringBoot的Session时,会加入如下依赖:

这个依赖会让启动类中的@EnableScheduling设定无效,就是说,此时无论有没有@EnableScheduling,系统中的所有定时器均会生效。

唉~具体原因,我猜是因为这个功能需要用到定时器,所以会默认开启了呗~折腾了我半天,真浪费时间~

关于Spring+Hibernate时,packagesToScan无法扫描到jar中实体类的解决办法

由于要做分布式,因此不同的微服务中会用到相同的实体类,因此需要将实体类拿到独立的项目中去,然后生成为jar来被不同的项目引用。

但是问题来了,当我使用MyEclipse进行Export导出成jar,然后由其他微服务引用此jar时,发现hibernate并没有扫描到jar中的实体类。

于是我翻了好多资料,找到以下两种解决办法:

第一种:在配置文件中指定jar中的注解实体类

但是这样做有个缺点,就是无法使用“*”号来进行通配,所以当你有十个类的时候,list中就得有十个value。

第二种(推荐):使用MyEclipse导出公共实体类时,要勾选“Add directory entiriess”

49f3fe9dd03935ab16bbeaa65c80b51

然后在需要引入该jar的项目中重新引入即可。

原因分析:

默认方式生成的jar包中,只含有class文件,而并没有我们大众所知的文件夹目录结构。可能我们大多数人认为com.test.Student类,Student类文件就应该在com文件夹下的test文件夹里,这其实是片面的,是一个误区!

com.test真正的含义是package包域名,就好比.net里的命名空间,它只是为了区分、汇总、唯一标识不同的类而提出的概念,跟文件夹目录层次结构是两回事,我们只是习惯上用文件夹目录来展示package而已。但package却不一定非要用过文件夹目录来展示。

我们可以用下面这段代码来进一步说明这个问题:

默认生成的jar包,运行结果如下:

如果勾选Add directory entries选项生成的jar包,运行结果如下:

这样也就解释了为何打成jar包后用getResource获取资源url总是为空的原因了。

MyEclipse2015导入SpringBoot2.x的maven项目时,pom.xml第一行出现错误提示的解决方法。

其实不是很建议大家为了这个错误进行以下操作,因为会让MyEclipse2015中的部分Spring功能被删除。请大家先做好MyEclipse的备份工作。

MyEclipse2015导入SpringBoot2.x的maven项目时,pom.xml第一行会出现如下的错误提示:

e2fa00b2caf6db3c0b04b0e3996fba7

解决办法是更新eclipse中的maven插件:

help -> Install New Software -> add

Name填写:MavenArchiver

Location填写:https://otto.takari.io/content/sites/m2e.extras/m2eclipse-mavenarchiver/0.17.2/N/LATEST

0ad3bf1b02d596543358077f8fe62c5

添加后一路Next,根据指示重启Eclipse

97991d71a4b83486d156efbc21f242d

不管错误提示一路继续,安装完后根据提示重启MyEclipse。

重启MyEclise对项目执行Update POM,错误提示则消失。

如果此时错误仍未消失,则选中项目,并右键 Maven -> Disable Maven Nature,接着依然右键Configure -> Convert to Maven Project,此时问题解决。(你可以删除项目重新导入,也能达到同样的效果)

SpringBoot2.1.1整合hibernate5.0.12使用SessionFactory

1、在pom.xml中加入如下依赖:

如果pom.xml中有如下jpa依赖,记得清注释以下内容:

 

2、在application.properties中加入如下配置:

如果在低版本SpringBoot中进行配置,则可能会遇到错误“Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true”,此时则需要在application.properties补充配置:

因为SpringBoot的SessionFactory会自动注入默认的Transactional事务管理器,但这个事务管理器搭配hibernate的SessionFactory会出现数据库连接池线程卡死的问题,即假如配置线程池的连接数为10,一旦连接数大于10,则线程池会出现卡死的情况,因此我们需要自行配置hibernate的事务管理器来覆盖SpringBoot原有的Transactional事务管理器。

3、在SpringBoot的启动入口类上加入注解@ImportResource(“classpath:hibernate.xml”):

4、在resources目录中加入配置文件hibernate.xml:

5、增加事务管理配置,有两种方式,一种是使用SpringBoot的config注入方式,另外一种是加在hibernate.xml中。(记住下面5.1和5.2是二选一)

5.1、使用SpringBoot的confiug注入方式:增加配置文件TransactionAdviceConfig.java:

5.2、加在hibernate.xml中:

 

6、增加事务管理过滤器FilterConfig.java,自动开启事务管理:

7、搞掂,启动项目!在需要使用SessionFactory的地方使用如下方式注入即可:

 

在SpringBoot中使用SessionFactory的方法

首先项目中已经使用JPA的方式连接,然后加入hibernate依赖:

 

然后有以下几种方式,选择一种合适自己的。

方法一:

增加配置文件HibernateConfig.java:

如果要使用@Transactional则需要在application.properties中加上:

 

方法二:(推荐)

在SpringBoot的启动类中加上:

如果要使用@Transactional则需要在application.properties中加上:

 

 

方法三:

在SpringBoot的启动类中加上:

如果要使用@Transactional则需要在application.properties中加上:

 

 

使用方法:

 

让SpringBoot2.0不使用hiraki数据库连接池而改用c3p0

SpringBoot2.0默认是用hiraki数据库连接池,听说这个是当今运行效率最高的,但由于某些原因我要使用c3p0数据库连接池,所以就给大家说一下我的配置过程,其实还是挺简单的:

在pom.xml中加上依赖:

然后注释掉原来application.properties中的默认数据库配置而改用c3p0的:

最后补充配置类:

搞掂,部署运行,在springboot的启动信息中可以看到c3p0已经生效了。

SpringBoot2.0+Hibernate在Controller使用Session并发性能调优

从SpringBoot2.0开始,其DataSource就交给了Hikari负责。

对于高并发需求,根据数据库的性能,若然Controller执行时间过长,过多controller正在等待有限的sessionFactory资源,则会造成线程堵塞,引起雪崩。

需要在springboot的配置中假如如下设置:

最主要是maximum-pool-size参数,在不设置的情况下默认是10,所以当用户卡在controller等待使用session资源时,做并发测试的时候就会出现卡死现象,引起雪崩。

如果controller中关于数据查询的部分的执行时间较长,maximum-pool-size一定要调大,但是这个值越大我猜测就越内存,一定要适当。

maven构建项目时出现”程序包javax.crypto不存在”

错误日志片段如下:

在maven的pom.xml中的plugins的maven插件的bootclasspath参数补上”${JAVA_HOME}/lib/jce.jar”, 见下面代码:

 

在CentOS7中使用Jenkins自动化部署SpringBoot项目

安装Jenkins

准备工作

计算机中先安装好JDK、Maven、Git,并记录其安装路径。

安装Jenkins

使用 yum install jenkins 来安装jenkins,安装好后使用 systemctl start jenkins启动。

使用浏览器访问该服务器的8080端口(默认),然后在选择安装插件的时候选择左边的默认插件。

配置Jenkins的插件

在Jenkins里面“manage – jenkins”的”manage plugins”点击”可选插件”,筛选maven,安装好Maven Integration plugin。(如果需要中文支持,则安装 locale plugin后在configure system找到Default Language设置为“zh_CN”并勾选“Ignore browser preference and force this language to all users Pipeline Speed/Durability Settings”后保存)

在Jenkins里面“manage – jenkins”的”global tool configuration”分别设置JDK、GIT、MAVEN的安装路径后保存。

修改Jenkins的运行权限为ROOT

修改jenkins的运行权限为ROOT,找到“vim /etc/sysconfig/jenkins”文件并编辑JENKINS_USER=”root”,然后重启jenkins

使用以下命令更改Jenkins主页,webroot和日志的所有权:

 

创建Maven项目

 

close