TNS-12541: TNS: 无监听程序TNS-00511: 无监听程序

最近遇到一个ORACLE本身的日志bug问题。查询过程让人很惊心!

最近维护的网站突然报数据库访问不了,很奇怪,都没人动过,无缘无故访问不了DB,用plsql登录下,发现报错无监听,更奇怪了。

后面重新建监听还是没用,最后同事发现是ORACLE日志达到4G造成的,删掉listen.log就好了,汗颜到不行。

这时候朋友怀疑是不是监听器配置问题,就把原先的监听器删除重建了下,问题依然。

网上有个解决TNS-12535错误的案例,平台和版本都很类似,如下:
1、在 sqlnet.ora文件中 增加如下行:
DIAG_ADR_ENABLED = OFF
2、在listener.ora文件中增加如下行:
DIAG_ADR_ENABLED_<listenername> = OFF
如何监听是listener时,则前面的名称为:DIAG_ADR_ENABLED_LISTENER = OFF
3、重新启动windows服务管理中的监听程序.先停止,然后再重新启动.
4、检查结果.发现可以了,返回的值在10毫秒.有时为0毫秒.成功!!

但这并不是问题发生原因,在继续排查过程中偶然发现监听日志大小居然为4G。然后把这现象告诉了Luocs。
过了一会儿,Luocs回应是Oracle一个BUG,BUG号为9879101 : THE CONNECT THROUGH LISTENER WAS SLOW WHEN LISTNER LOG GROWED 4GB。
 

一篇文章,里面给出了解决方法:

You can solve this problem by deleting the large listener in $ORACLE_BASE\diag\tnslsnr\<hostname>\listener\trace\<listener_name>.log
1)  Stop the listener process using the command line or Control Panel Service.

2) Delete the log file(s) that are at or approaching the 4G size limit at this location:
$ORACLE_BASE\diag\tnslsnr\<hostname>\listener\trace\<listener_name>.log
3)  Issue any lsnrctl command and you will see a new listener.log in its place under:
$ORACLE_BASE\diag\tnslsnr\<hostname>\listener\trace\


Since ADR Diagnostics are enabled for this listener these steps cannot be done dynamically using the lsnrctl utility. 
e.g.
LSNRCTL>set log_file mylog
Will yield:  TNS-01251: Cannot set trace/log directory under ADR.

However, it is possible to disable the flat file listener logging using the following commands:

LSNRCTL>set current_listener <listener_name>
LSNRCTL>set log_status OFF
LSNRCTL>save_config

我就按照以上说明如下进行:
1)LSNRCTL进入交互模式
2)执行set current_listener LISTENER
3)set log_status off
4)stop 停止监听器
5)手工删除ADR指定的监听日志路径下的listener.log文件
6)start重启监听器
7)status查看状态

到此问题解决。

虽然最后解决过程仅仅耗费了短短几分钟时间,但整个排错过程却是令人惊讶。在此整理,并与遇到同样问题的朋友分享。

### MyBatis 中判断 `int` 类型是否为空的解决方案 在 MyBatis 中处理 Java 基本数据类型如 `int` 时,由于基本类型的默认值不是 `null` 而是 `0`,这可能导致一些意外行为。为了正确处理这种情况,通常建议使用对应的包装类 `Integer` 来代替 `int`。 #### 使用 `Integer` 替代 `int` 通过将参数定义为 `Integer` 可以允许其接受 `null` 值: ```xml <select id="getUserById" parameterType="java.lang.Integer" resultType="User"> SELECT * FROM users WHERE user_id = #{userId} </select> ``` 这样可以在映射文件中的条件语句里直接测试该变量是否为 `null` 或者有具体数值[^1]。 #### 处理 SQL 查询中的零值情况 对于那些可能接收到来自前端应用传递过来的实际业务逻辑上的 “空白” 输入(即整数形式下的 &#39;0&#39;),可以通过调整 `<if>` 测试表达式的写法来区分真正的未赋值状态与合法输入之间的差异: ```xml <where> <if test="_parameter != null and _parameter.intValue() != 0"> AND column_name = #{value} </if> </where> ``` 这里 `_parameter` 是指当前上下文中正在评估的那个对象实例;而 `.intValue()` 方法则用来获取实际存储于其中的具体数值以便进一步比较[^2]。 #### 设置 JDBC Type Result Map 另外,在某些情况下还需要特别指定 JDBC type 属性以及配置适当的结果集映射(result map),从而确保数据库端的数据能够被正确解释并转换成预期的目标类型。例如针对日期字段应设置合适的 jdbcType 参数[^3]: ```xml <resultMap id="BaseResultMap" type="com.example.User"> <!-- other columns --> <result property="birthDate" column="birthdate" jdbcType="DATE"/> </resultMap> <!-- ... --> <insert id="insertSelective" parameterType="com.example.User"> INSERT INTO t_user ( birthdate, ... ) VALUES ( <trim prefix="(" suffix=")" suffixOverrides=","> <if test="birthDate != null">#{birthDate,jdbcType=DATE},</if> ... </trim> ) </insert> ``` 以上措施有助于提高应用程序面对不同类型数据源时的一致性稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值