解决erlang和java同时操作一张表,造成锁表问题

作者:张昌昌

1、问题描述

Erlang端通过odbc去写oracle一张表,同时java通过jdbc驱动也去写这张表,当同时多次发生这种写操作时,这个表就被锁。

2、问题解决

思路:利用适配器原理,适配erlang和java的数据库连接,让erlang端对数据表的操作与java端对该数据表的操作,分时序顺序进行,其中一端在进行写操作时上锁

另一端就不能操作,直到他操作完成释放锁,另一端才能操作。

该适配器采用java编写,通过otp.jar让erlang与java进行通信,erlang和java对数据表操作的连接都要从该适配器入

实现方式:

(1)java端

public class ConnectionAdaptor {

private static final ConnectionAdaptor instance = new ConnectionAdaptor("javaNode","theMailbox","secret");

private OtpNode node;

private static OtpMbox mbox;

private ReentrantLock lock = new ReentrantLock();

public static ConnectionAdaptor getInstance(){

return instance;

}

private ConnectionAdaptor(String nodeName,String mboxName,String cookie){

super();

try{

node=new OtpNode(nodeName,cookie);

}catch(IOException e){

e.printStackTrace();

}

System.out.print(node);

mbox = node.createMbox(mboxName);

}

private void process(){

while(true){

try{

OtpErlangObject msg = mbox.receive();

OtpErlangTuple t = (OtpErlangTuple)msg;

OtpErlangPid from = (OtpErlangPid)t.elementAt(0);

String name = ((OtpErlangString)t.elementAt(1)).stringValue();

if(name.equals("write_start"))

adaptor(1);

}catch(Exception e){

}

}

}

public static void main(String[] args){

//启动一个线程用于erlang消息的侦听

new Thread(){

public void run(){

ConnectionAdaptor.getInstance().process();

}

}.start();

//启动一个线程进行java端的数据表操作

new Thread(){

public void run()

{

for(int i=0;i<10;i++)

{

try{

try{

ConnectionAdaptor.getInstance().adaptor(2);

}catch(Exception e){

e.printStackTrace();

}

}catch(Exception e)

{

e.printStackTrace();

}

}

}

}.start();

}

public void adaptor(int type){

lock.lock();

if (type == 1)

{

while(true)

{

OtpErlangObject msg = mbox.receive();

OtpErlangTuple t = (OtpErlangTuple)msg;

OtpErlangPid from = ((OtpErlangString)t.elementAt(1)).stringValue();

if(name.equals("write_end"))

{

System.out.println("erlang write table end");

lock.unlock();

}

}

}

else

{

Thread.sleep(5000);

System.out.println("java write table end");

lock.unlock();

}

}

}

erlang端:

-module(erl_to_java).

-export([write_table/0,start/1]).

write_table() ->

{theMailbox,[email protected]}!{self(),"write_start"},

timer:sleep(5000),

{theMailbox,[email protected]}!{self(),"write_end"}.

start(N) ->

case N =:= 0 of

true -> ok;

false -> write_table(),start(N-1)

end.

3、时序图

4、问题总结

(1)java单例模式

(2)java与erlang通信

(3)java线程间锁机制

首先利用单例模式获取一个适配器对象,然后启动一个线程执行process(),侦听来自erlang端的写表消息,一旦有erlang发出写表请求,需加锁,在erlang进程中执行

写表操作后,向java进程发送写表结束请求,然后java进程释放锁,一旦有java端写表操作,便获取锁进行写表操作,之后释放锁,在java写表期间,erlang的写表操作必须等待,直到锁释放,反之亦然。

5、使用方法

(1)运行该适配器的java端需要安装erl的运行环境,需要导入OtpErlang.jar包;

(2)erlang端节点启动时,要和适配器单例创建时的cookie保持一致,同时

erl -sname erlangNode -setcookie secret -pa "erl_to_java.bin所在的路径" -eval "net_adm:ping([email protected])"

时间: 2024-10-16 14:00:16

解决erlang和java同时操作一张表,造成锁表问题的相关文章

Hiver 操作 MySQL 导致锁表

Hadoop 搬迁到新集群后,操作主库 MySQL 导致了锁表...sad 具体锁表时间点  : 2016-1-14 14:31  到   2016-1-14 14:36 之间 在 oradba 的 innodbstatus 信息拿到后,还需要后续继续分析到底是哪条 SQL 锁的... 参考 Link : http://mysqllover.com/?p=431

Hadoop读书笔记(三)Java API操作HDFS

Hadoop读书笔记(一)Hadoop介绍:http://blog.csdn.net/caicongyang/article/details/39898629 Hadoop读书笔记(二)HDFS的shell操作:http://blog.csdn.net/caicongyang/article/details/41253927 JAVA URL 操作HDFS OperateByURL.java package hdfs; import java.io.InputStream; import jav

HDFS的Java客户端操作代码(HDFS的查看、创建)

1.HDFS的put上传文件操作的java代码: 1 package Hdfs; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.IOException; 6 import java.net.URI; 7 8 import org.apache.hadoop.conf.Configuration; 9 import org.apache.hadoop.fs.F

Java程序操作数据库SQLserver详解

数据库基本操作:增删改查(CRUD) crud介绍(增.删.改.查操作) CRUD是指在做计算处理时的增加(Create).查询(Retrieve)(重新得到数据).更新(Update)和删除(Delete)几个单记事的首字母简写.主要被用在描述软件系统中数据库或者持久层的基本操作功能. Create new records Rctricvc cxisting rccords Update existing records Delete existing records. 要对数据表进行增.删.

Java路径操作具体解释

1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或文件夹在硬盘上真正的路径.(URL和物理路径)比如: C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://www.sun.com/index.htm也代表了一个 URL绝对路径. 相对路径:相对与某个基准文件夹的路径.包括Web的相对路径(HTML中的相对文件夹),比如:在 Servlet中."/"代表Web应用的根文件夹.和物理路径的相对表示.比如:". /" 代表当前文件

Java路径操作详解

1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如: C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://www.sun.com/index.htm也代表了一个 URL绝对路径. 相对路径:相对与某个基准目录的路径.包含Web的相对路径(HTML中的相对目录),例如:在 Servlet中,"/"代表Web应用的根目录.和物理路径的相对表示.例如:". /" 代表当前目录, &q

Java NIO 操作总结

问题: 1.Java NIO 出现大量CLOSE_WAIT或TIME_WAIT的端口无法释放 CLOSE_WAIT: 参考:http://my.oschina.net/geecoodeer/blog/191774.http://blog.csdn.net/ruixj/article/details/1871979 解决:检查代码可发现,一端的socket调用了close,但是另外一端的socket没有调用close,于是在另外一端加上了socket.close()函数,使得CLOSE_WAIT消

IFRAME跨域名的解决方法,终结版(小张.NET原创)[摘自 西部数码]

以前碰到此类问题很郁闷,MS为什么开发出这么个鸟IE,让这些人不得不跟着他走,后来想了想,也是,为了安全期间,还是要加上限制的,要不,别人可以随便的改你的网页内容,等等...好了,其它的废话不说了,看看下边的吧:记得要将域名指为域名,而不是WWW或者其它的,例:shagndu8.com 而不能指向www.shangdu8.com 1.请在父网页上加上以下代码:1<SCRIPT LANGUAGE="VBScript">2    document.domain = "

Java API操作HDFS

HDFS是存储数据的分布式文件系统,对HDFS的操作,就是对文件系统的操作,除了用HDFS的shell命令对文件系统进行操作,我们也可以利用Java API对文件系统进行操作,比如文件的创建.删除.修改权限等等,还有文件夹的创建.删除.重命名等等. 使用Java API对文件系统进行操作主要涉及以下几个类: 1.Configuration类:该类的对象封装了客户端或者服务端的配置. 2.FileSystem类:该类的对象是一个文件系统对象,可以利用该对象的一些方法来对文件进行操作,FileSys