Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

连接泄露,请教一下分布式事务的配置是否有问题 #21

Closed
HanhongWang opened this issue Jan 29, 2021 · 8 comments
Closed

Comments

@HanhongWang
Copy link

HanhongWang commented Jan 29, 2021

yml文件的配置:

fastdep:
datasource:
base:
mapper: com.whh.druid.mapper.base
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:xxx
username: xxx
password: xxx
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
removeAbandoned: true
removeAbandonedTimeout: 1800
logAbandoned: true
keepAlive: true
filters: stat,wall,slf4j

jta事务的配置类

`@Configuration
@EnableTransactionManagement
public class JTAConfig {
@bean
@primary
public JtaTransactionManager jtaTransactionManager() throws SystemException {
UserTransactionImp userTransactionImp = new UserTransactionImp();
userTransactionImp.setTransactionTimeout(600);
JtaTransactionManager jta = new JtaTransactionManager();
jta.setUserTransaction(userTransactionImp);

// jta.setDefaultTimeout(600);
return jta;
}
}`

控制台报错:

2021-01-29 10:17:55.178 ERROR 5048 --- [stroy-635543541] com.alibaba.druid.pool.DruidDataSource : abandon connection, owner thread: http-nio-8390-exec-7, connected at : 1611884869216, open stackTrace

@louislivi
Copy link
Owner

不配置JTAConfig 是否正常呢

@louislivi
Copy link
Owner

看这个错误,貌似和全局事物无关

@HanhongWang
Copy link
Author

@louislivi 不配置JTAConfig也不正常,我又做了另外一个测试:不引用fastdep-datasource,单独引用druid-spring-boot-starter、mybatis-spring-boot-starter、spring-boot-starter-jta-atomikos,就不存在连接泄露的问题,请问一下我的fastdep配置有问题吗?

        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.21</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jta-atomikos</artifactId>
        <version>2.4.2</version>
    </dependency>

@louislivi
Copy link
Owner

@WangHanHong 这个看着应该是removeAbandoned 的问题

@louislivi
Copy link
Owner

removeAbandoned配置会引发这个问题,建议查看相关问题进行解决。

@HanhongWang
Copy link
Author

@louislivi removeAbandond是打开的,他的作用是强制回收连接,但是我的代码就是一个简单的查询 @RequestMapping("getModel") public String getModel(String id) { List<MsgModel> models = modelMapper.listMsgModelByCondition(new HashMap<String, Object>() {{ put("id", id); }}); return models.get(0).getContent(); }不存在慢查询的问题,而且我把removeAbandonedTimeout设成了1800s,sql的查询时间在这个范围内,我的业务代码应该不会造成连接泄露,我打开druid的监控显示 始终有6个连接未释放

@louislivi
Copy link
Owner

removeAbandoned是连接池的高级功能,理论上这中配置不应该出现在实际的生产环境,因为有时应用程序执行长事务,可能这种情况下,会被连接池误回收,该种配置一般在程序测试阶段,为了定位连接泄漏的具体代码位置,被开启。生产环境中连接的关闭应该靠程序自己保证。

@louislivi
Copy link
Owner

问题的原因不明,也有可能是兼容问题,可以查看源码中进行确认,但是fastdep做到的仅仅是注入bean的操作,并未针对druid或者其他依赖相关配置以及源码修改。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants