oracle 的一些使用记录

win安装

Win10安装Oracle 19c+PLSQL 14.0

docker安装

Docker安装Oracle(超详细,清晰)_docker oracle_心 灵的博客-CSDN博客

锁行问题

问题描述:当执行update语句的时候,执行超时
原因:在 update 和 insert 操作以后,没有 commit 异常关闭连接
解决:

-- 查找加锁的行
select
    object_name,
    machine,
    s.sid,
    s.serial#
from
    v$locked_object l,
    dba_objects o ,
    v$session s
where
    l.object_id = o.object_id
and
    l.session_id=s.sid;
-- 处理锁
ALTER system KILL session 'SID,serial#';

TimeStamp时间类型读取问题

在使用jdbc结合反射去读查询到的行的时候,默认返回类型是 oracle.sql.TIMESTAMP
这个类型在 序列化以及后面的使用都会很不方便

protected <T> ArrayList<T> query(Class<T> clazz, String sql, DynamicQueryUtil query) throws Exception {
        //设置?的值
        query.setBaseSql(sql);
        sql = query.generateSql();//如果想排序,自行在sql后添加

        //        创建PreparedStatement对象,对sql预编译
        Connection connection = JDBCTools.getConnection();
        PreparedStatement ps = connection.prepareStatement(sql);

        query.fillPreparedStatement(ps);//填充pst

        ArrayList<T> list = new ArrayList<>();
        ResultSet res = ps.executeQuery();

        /*
        获取结果集的元数据对象。
        元数据对象中有该结果集一共有几列、列名称是什么等信息
         */
        ResultSetMetaData metaData = res.getMetaData();
        int columnCount = metaData.getColumnCount();//获取结果集列数

        //遍历结果集ResultSet,把查询结果中的一条一条记录,变成一个一个T 对象,放到list中。
        while (res.next()) {
            //循环一次代表有一行,代表有一个T对象
            T t = clazz.newInstance();//要求这个类型必须有公共的无参构造

            //把这条记录的每一个单元格的值取出来,设置到t对象对应的属性中。
            for (int i = 1; i <= columnCount; i++) {
                //for循环一次,代表取某一行的1个单元格的值
                Object value = res.getObject(i);

				// 对于 Timestamp 类型特殊处理
                if (value instanceof TIMESTAMP){
                    value = DateUtils.dateToTimestamp(((TIMESTAMP) value).dateValue());
                }
                
                //这个值应该是t对象的某个属性值
                //获取该属性对应的Field对象
//                String columnName = metaData.getColumnName(i);//获取第i列的字段名
                String columnName = metaData.getColumnLabel(i);//获取第i列的字段名或字段的别名
                Field field = clazz.getDeclaredField(columnName);
                field.setAccessible(true);//这么做可以操作private的属性

                field.set(t, value);
            }

            list.add(t);
        }

        res.close();
        ps.close();
        //这里检查下是否开启事务,开启不关闭连接,业务方法关闭!
        //没有开启事务的话,直接回收关闭即可!
        if (connection.getAutoCommit()) {
            //回收
            JDBCTools.free();
        }
        return list;
    }

这里我手动添加了转换

// 对于 Timestamp 类型特殊处理
if (value instanceof TIMESTAMP){
	value = DateUtils.dateToTimestamp(((TIMESTAMP) value).dateValue());
}

转换成了 java.sql.TimeStamp 类型
其实分析以后,很大一部分原因还是我这边用的工具类,如果使用 getTimestamp 方法去取的话,就没有这个问题了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值