IBM WAS5.x "无法定位资源引用 jdbc/DSName,因此使用下列缺省值"问题解决方案

本文介绍了一种有效的方法来解决WebSphere Application Server (WAS) 日志中频繁出现的ConnectionFacIJ2CA0122I警告信息。通过正确配置resource-ref标记并在相关文件中进行必要的修改,可以避免这些信息的出现,从而提高日志的可读性和系统的维护效率。

ConnectionFac I J2CA0122I: 无法定位资源引用 jdbc/DSName,因此使用下列缺省值:[Resource-ref settings]

res-auth: 1 (APPLICATION)
res-isolation-level: 0 (TRANSACTION_NONE)
res-sharing-scope: true (SHAREABLE)
res-resolution-control: 999 (undefined)
[Other attributes]

isCMP1_x: false (not CMP1.x)
isJMS: false (not JMS)


公司一直用WSAD开发,服务器总是System.out这个问题,虽然不是错误,但是很烦人,想去掉了,问了不少人,也google了很多次,没有找到解决办法。今天百度了一下,终于解决了(看来还是多个搜索引擎并存的好,至少多了一个选择)。

准备写一个,但是原来写得很好,就转一下吧,希望这个帖子能尽快收录到google,帮助不明白此问题的网友找到答案。

==>>>以下为转帖内容:

那天他们把43的数据库连接改成了缓冲池,在WAS上调程序的时候发现LOG里老有如下信息:

ConnectionFac I J2CA0122I: 无法定位资源引用 jdbc/DSName,因此使用下列缺省值:[Resource-ref settings]

res-auth: 1 (APPLICATION)
res-isolation-level: 0 (TRANSACTION_NONE)
res-sharing-scope: true (SHAREABLE)
res-resolution-control: 999 (undefined)
[Other attributes]

isCMP1_x: false (not CMP1.x)
isJMS: false (not JMS)

是在每一次连接数据库时,为什么呢?数据库的连接没有问题,对数据库的操作也没有受到一点儿影响……?
后来到网上SEARCH了一下,发现好多人都遇到了这个问题,当然也找到了解决的办法。但,不行!
因为事儿多所以就耽误了下来,正好今天IBM软件部的胡鹏飞来给我们讲WAS6(好家伙,5天的课程,今天一天全都突击出来)。
下午讲完课后我问他这个问题如何解决,他告诉我如何如何解决。他的方法与我的一样,可我的为什么不行呢?

解决方法如下:

J2EE 1.3的规范里面是推荐通过引用来访问各种资源,而不是直接使用资源的名字。对于数据源而言,虽然可以通过InitialContext的lookup("jdbc/DSName")来使用,但这不是推荐的做法,而且在SystemOut.log日志中出现上述信息。如果为应用程序模块定义相应的数据源引用,然后在代码中用InitialContext的lookup("java:comp/env/DSRefName")就不会出现上述信息。
主要是要把web.xml中的resource-ref标记设为
<resource-ref id="ResourceRef_#">
<res-ref-name>jdbc/DSName</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>CONTAINER</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
在JAVA使用缓冲池连接数据库时这样写:
...........
Context ctx = new InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup("java:comp/env/jdbc/DSName");
connection = ds.getConnection();
............

我在WAS的控制管理器中说什么也没有找到设置resource-ref的地方,后来我想是不是应该重新部署一下应用呢?我嫌麻烦就没有做,胡鹏飞告诉我要设置resource-ref只能重新部署应用。如果手工改文件比较麻烦,因为在ibm-web-bnd.xmi和ibm-web-ext.xmi都要做绑定。他建议我先在WSAD中设置完再把这三个文件复制到WAS里。并且在应用服务器的config目录里也要有相应的修改,因为WAS读的是config目录下的配置,不是企业应用。
sigh,恍然大悟啊,明白了,MD因为WAS还牵扯到集群方面,所以它不能从企业应用读配置文件。我还是懒,所以我要手工改。嘿嘿!web.xml早就改好了:D,我把ibm-web-bnd.xmi和ibm-web-ext.xmi打开,将与resource-ref所对应该的地方改好,当然config目录也是同样。重起了服务器后,再试。如然好了!:p

ibm-web-bnd.xmi和ibm-web-ext.xmi里绑定代码分别是:

[ibm-web-bnd.xmi]
.......
<resRefBindings xmi:id="ResourceRefBinding_#" jndiName="jdbc/DSName">
<bindingResourceRef href="WEB-INF/web.xml#ResourceRef_#"/>
</resRefBindings>
.......

[ibm-web-ext.xmi]
.......
<resourceRefExtensions xmi:id="ResourceRefExtension_#" connectionManagementPolicy="Default">
<resourceRef href="WEB-INF/web.xml#ResourceRef_#"/>
</resourceRefExtensions>
.......

note:代码基本上是放在<webApp href="WEB-INF/web.xml#WebApp_ID"/>标记的下面。

有几项注意的就是,
一、如果企业应用已经部署好了要对resource-ref,换句话说要改web.xml的设置,最好在外面改好比如WSAD里,再重新部署进WAS里。
二、如要手工改的话别忘了ibm-web-bnd.xmi和ibm-web-ext.xmi这两个问题要做关联的设置,还有应用服务的config目录。
三、为什么我在JAVA连数据库时没有在getConnection时加入用户名和密码呢,嘿嘿,因为在WAS的JAAS下的J2C设好了用户,并在设置JDBC缓冲池时在"组件受管认证别名"和"容器受管的认证别名"已经选中了我设置的数据库用户。

// ===== 编辑时回填数据 ===== async function fillEditForm(row: DataVariableGroup) { formData.name = row.name; formData.inUse = row.inUse; rightSelectedItems.value = []; // 并行获取所有数据源名称(推荐) const promises = row.dataGroup.map(async (vg) => { const dataSourceId = vg.dataSourceId; const dsName = await getDataSourceName(dataSourceId); const variables = Array.isArray(vg.variable) ? vg.variable : [vg.variable]; const variable = variables[0]; // 取第一个用于显示 // 处理 tableName:兜底为 "未知表" const tableName = variable.tableName || 'unknown_table'; // 处理 fields:兜底为空数组 const fields = variable.selectColumns || []; // 处理 limit:规范化为 [offset, size] 元组 let limit: number | [number, number] | undefined = undefined; if (typeof variable.limit === 'number') { limit = variable.limit; } else if (Array.isArray(variable.limit)) { if (variable.limit.length >= 2) { limit = [variable.limit[0], variable.limit[1]]; // [offset, limit] } else if (variable.limit.length === 1) { limit = [0, variable.limit[0]]; // 默认 offset=0 } } return { dataSourceId, dataSourceName: dsName, tableName, fields, where: variable.whereConditions, orderBy: variable.orderBy, limit }; }); // 等待全部完成 const resolvedItems = await Promise.all(promises); rightSelectedItems.value.push(...resolvedItems); // 同步到 formData.config syncFormData(); } export interface DataVariableGroup { uuid:string; name:string; dataGroup:Array<Variable>; inUse:boolean; creatTime:Date; } export interface Variable{ dataSourceId:string; tableName?:string; whereConditions?: Record<string, any>; orderBy?: Record<string, 'ASC' | 'DESC'>; limit?: number | number[] selectColumns:string[]; values?:any } 重写fillEditForm
最新发布
12-14
// src/components/SearchResultList.tsx import React from 'react'; import { List, Card, Typography, Tag, Space } from 'antd'; import { message } from 'antd'; const { Title, Text, Paragraph } = Typography; interface AssetsItem { id: string; dsName: string; dsTableName: string; dsType: string; areaId: string; areaName: string; sysId: string; sysName: string; bussinessObjName: string; bussinessObjId: string; processPointName: string; dsOwnerName: string; dsOwnerNum: string; isConfirm: string; dsMemo: string; dsRange: string; tags: string; demoFileName: string; demoOssFilePath: string; createUser: string; } // 高亮关键词函数 const highlightKeyword = (text: string, keyword: string | null | undefined): React.ReactNode => { if (!keyword || !text || typeof text !== 'string') return text; const regex = new RegExp(`(${keyword})`, 'gi'); // 忽略大小写匹配 const parts = text.split(regex); return parts.map((part, index) => part.toLowerCase() === keyword.toLowerCase() ? ( <span key={index} style={{ color: 'red', fontWeight: 'bold' }}> {part} </span> ) : ( part ) ); }; // 预览文件函数 const handlePreview = (url: string) => { if (url) { const base64Url = btoa(unescape(encodeURIComponent(url))); window.open('http://10.255.96.51:8012/onlinePreview?url=' + encodeURIComponent(base64Url)); } else { message.error('无法预览文件'); } }; interface SearchResultListProps { results: AssetsItem[]; keyword: string | null; } const SearchResultList: React.FC<SearchResultListProps> = ({ results, keyword }) => { // 判断是否无数据 const isEmpty = !results || results.length === 0; return ( <div> {isEmpty ? ( <div style={{ textAlign: 'left', padding: '50px 20px', color: '#999', fontSize: '16px', }}> 您搜索的关键词暂无相关数据资产 </div> ) : ( <List dataSource={results} renderItem={(item) => ( <List.Item style={{ marginBottom: -5 }} key={item.id}> <Card style={{ width: '100%', padding: 10 }} bodyStyle={{ padding: 5 }}> <Title level={4}> <a href="#">{highlightKeyword(item.dsName, keyword)}</a>    {item.isConfirm === 'true' ? ( <Tag color="red" key={item.id}> 数据已确认 </Tag> ) : null} </Title> <Text type="secondary">{highlightKeyword(item.dsTableName, keyword)}</Text> <div style={{ margin: '8px 0' }}> {item.tags.split(',').map((tag, index) => ( <Tag color="blue" key={index}> {highlightKeyword(tag, keyword)} </Tag> ))} </div> <Paragraph>{highlightKeyword(item.dsMemo, keyword)}</Paragraph> <Space direction="vertical" size="small"> <Text> 范围:<Text strong>{highlightKeyword(item.dsRange, keyword)}</Text> </Text> <Text> 领域:<Text strong>{highlightKeyword(item.areaName, keyword)}</Text>     系统:<Text strong>{highlightKeyword(item.sysName, keyword)}</Text>     对象:<Text strong>{highlightKeyword(item.bussinessObjName, keyword)}</Text>     流程:<Text strong>{highlightKeyword(item.processPointName, keyword)}</Text> </Text> <Text> 创建人:<Text strong>{highlightKeyword(item.createUser, keyword)}</Text> </Text> <Text> 数据Owner:<Text strong>{highlightKeyword(item.dsOwnerName, keyword)}</Text> </Text> <Text> 类型:<Text strong>{highlightKeyword(item.dsType, keyword)}</Text> </Text> {/* 如果有样例文件则显示 */} {item.demoFileName && item.demoFileName !== '' ? ( <Text> 样例数据:{' '} <a href="#">{highlightKeyword(item.demoFileName, keyword)}</a>       <span onClick={() => handlePreview(item.demoOssFilePath)} style={{ color: 'blue', cursor: 'pointer', marginRight: 10 }} > 预览 </span>     <span> <a href={item.demoOssFilePath}>下载</a> </span> </Text> ) : null} </Space> </Card> </List.Item> )} /> )} </div> ); }; export default SearchResultList; 以上代码 增加分页展示功能 ant design pro 5.0版本
08-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值