- 浏览: 63912 次
- 性别:
- 来自: 南京
最新评论
-
heshuanxu:
我还是没找到文件位置,加入FileOutputStream f ...
如何获得Java动态代理的代理类 -
xujianjie12138:
大赞!谢谢你!
JAVA断点续传简单实现 -
abc08010051:
很有用,很实用
如何获得Java动态代理的代理类 -
daly1987:
很好的文章!
如何获得Java动态代理的代理类 -
奥义之舞:
samttsch 写道直接计数不准确,每次到达上限,你slee ...
多线程发送消息之流控
文章列表
如何获得Java动态代理的代理类
- 博客分类:
- 学习
JDK 代理生成器,在生成类是会根据参数“sun.misc.ProxyGenerator.saveGeneratedFiles”来决定是否将二进制保存到本地文件中,
具体的路径查看源码:
ProxyGenerator.access$000(this.val$name) + ".class"
根据access$000这个方法生成的路径来保存
在openjdk中这个access$000 是对应
private static String dotToSlash(String name) {
return name.replace('.', '/');
}
所以 ...
创建一个新的回滚段(如果不行,则先将tablespace=''设置为空,删除掉旧的回滚段)
create undo tablespace undotbs1 datafile '/opt/oracle/app/oradata/undotbs1.dbf' size 10m reuse autoextend on;
切换undo表空间
alter system set undo_tablespace=undotbs1 scope=both;
删除旧的表空间
drop tablespace undotbs2 including contents and datafiles;
jdbc 的resultset有三种cursor类型:
ResultSet.TYPE_FORWARD_ONLY:表示cursor只能向前移动,absolute first last等方法无效。
ResultSet.TYPE_SCROLL_INSENSITIVE:表cursor可以自由移动,但对于修改不敏感
ResultSet.TYPE_SCROLL_SENSITIVE:表cursor可以自由移动,但对于修改敏感
TYPE_SCROLL_INSENSITIVE 如何实现:
jdbc驱动在实现TYPE_SCROLL_INSENSITIVE会将sql语句的结果存在JVM的cache中,(数据库 ...
oracle 存储过程调优小结
- 博客分类:
- oracle
1.对于分区表中的数据,直接删除掉分区表,alter table table_name drop partition partition_name; 因为分区表的分区相当于一个独立的表,删除分区相当于直接删除一个表速度快。
2.在删除大量数据时,批量删除,使用rownum一次只删除一部分,这样删除的语句可能存在一个循环,如:有多个表,每个表每次删除1000条数据,这样会存在一个问题,当只有一个表中有数据需要删除时,删除其他表的sql其实是多余的
解决方法:使用数组来保存上次删除的条数(sql%count),这样如果一个表中没有需要删除的数据,下次执行sql时不会再执行
3.对于多个sql中相 ...
oracle 使用带参游标删除分区表
- 博客分类:
- oracle
在生产环境中会产生大量的数据,而许多数据过了一定时间后就无效了,需要删除
一般可以根据时间来创建分区表,将不同时间的数据放在不同的分区表中,需要清理的时候不需要通过delete语句来删除,而是通过drop分区表的方式,这样速度会非常快
如 日志表 TEST_LOG
1.建立默认的分区 TEST_LOG
2.定时任务每个月创建一个分区表如:TEST_LOG20110809
3.定时任务删除过期分区表:
cursor del_part_table
(table_name in varchar2, part_prefix in varchar2 ,v_num in varchar2)
is ...
DBCP 学习-Abandoned
- 博客分类:
- 学习
DBCP-330 DBCP-352
return new DelegatingDatabaseMetaData(this, _conn.getMetaData());
每次都会新建一个DelegatingDatabaseMetaData,而DelegatingDatabaseMetaData 自己添加到
connection trace中 addTrace,这样就会导致每次getMetaData()都会有一个DelegatingDatabaseMetaData
添加到这个connection中,从而GC不会回收.
解决方法:
在构建DelegatingDatabaseMetaData时调用s ...
DBCP学习-多个不受控制的连接池
- 博客分类:
- 学习
https://issues.apache.org/jira/browse/DBCP-342
DBCP-93 DBCP-339 DBCP-342 都是同一个问题
问题描述:
在常见connectionPool的时候,由于SQLException(例如密码错误等)导致在王connectionPool添加连接的时候发生异常,旧的处理时直接抛出,不会返回
在下一次调用getConnection的时候依旧会发生这个问题,但是connectionPool是一个GenericObjectPool,connectionPool.addObject()添加连接失败,connectionPool这个对象本身还 ...
DBCP学习-bug334
- 博客分类:
- 学习
https://issues.apache.org/jira/browse/DBCP-334?page=com.atlassian.jira.plugin.ext.subversion%3Asubversion-commits-tabpanel#issue-tabs
在DBCP的bug report上有一个bug:
The BasicDataSource should have the "softMinEvictableIdleTimeMillis" (get and set) as the GenericObjectPool, to avoid destroying id ...
BasicDataSourceFactory 使用JNDI时用来创建 BasicDataSource
BasicDataSource
先创建一个ConnectionFactory (DriverConnectionFactory) 驱动连接工厂,通过加载driverClassName, Class.forName(driverClassName);
再根据url得到Driver, DriverManager.getDriver(url);
设置连接属性 connectionProperties 用户密码
创建一个DriverConnectionFactory,驱动连接工厂,其实就是物理 ...
imp导入大数据量文件
- 博客分类:
- oracle
在使用exp、imp将数据转移时,由于现场的数据可能是海量,在使用exp导出的时候,exp会导出建表语句和表的内容,建表中有一个参数initial,这个参数表示表的初始化的大小,默认是64k,而exp时,会根据表的大小动态的改变这个值,那么在导入的时候,会先创建这个表,而假如是海量数据,那么创建表就会失败,导入不成功
解决:先创建表(initial默认64k),导入时,指定ignore=y,表示忽略错误,创建表失败时,也会继续导入数据。
也可以导出少量数据,使用tables,query指定表和指定列,导出指定的数据
如果确定哪些数据,可以使用plsql导出insert语句
java interrupted使用
- 博客分类:
- 学习
1 interruped
java中当一个线程sleep时,调用其中断方法是无效的,因此在异常的处理中需要将线程interrupt(),否则线程依然是非interrupt状态。
下面的例子中,线程将进入死循环,不会退出,因为主线程调用了interrupt()方法时,线程s正在睡眠。
正确的方法应该在异常中调用Thread.currentThread().interrupt();
public static void main(String[] args) throws InterruptedException
{
Thread s = new Thread(){
...
基于事件的NIO多线程服务器
- 博客分类:
- 学习
最近在学习mina2,在ibm developerworks发现一篇文章对于理解mina的架构很有益处,特作此记录。
http://www.ibm.com/developerworks/cn/java/l-niosvr/
例子的架构:
1.服务主程序,接受请求将key交给reader来处理,reader是多线程的方式,维护一个静态的key的列表。
2.实现了和mina2类似的filter,在调用accept方法前触发fireOnAccept,接受ok之后触发fireOnAccepted,notifier内部有一个listeners列表,事件触发时调用依次listeners指定的事件处理方 ...
改进:
1.取消任务可以将任务下载的详细情况保存下来
2.可以根据保存的下载详细信息重新下载任务
http方式适合高并发,短连接的方式,对于长连接,下载大型文件并不适合。
接下来尝试使用nio来实现断点续的功能
1 每次不会全部提交子任务(大文件下载的子任务太多),每次提交3个任务。
2 对于下载失败的任务,会尝试3次重新下载。
3 修改了Progressor收到的更新消息丢失的问题(大量子任务同步时,消息丢失),在Progressor和DownTask的update方法上都加上synchronized。
4 子任务下载的大小超过5M,使用FileChannel.map方法,提高速度
实现了客户端
1 多线程分段下载
2 使用观察者模式实现了下载信息反馈
3 在servlet中实现了取得文件大小的功能
下次改进点:
1.使用Executors,不好暂停
2.使用HttpURLConnection不好对通信的各种异常进行处理
3.数据量很大时可以用FileChannel来改进大文件的写入速度
4.保存文件下载信息,可以对位下载完成的任务重新进行下载
5.对速度进行控制(客户端和服务端分别控制)