docker中oracle数据库数据持久化的问题,如果将本地的文件夹挂载到docker容器中

docker中oracle数据库数据持久化的问题,如果将本地的文件夹挂载到docker容器中,第1张

docker可以支持把一个宿主机上的目录挂载到镜像里。

docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash

通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。

现在镜像内就可以共享宿主机里的文件了。

默认挂载的路径权限为读写。如果指定为只读可以用:ro

docker run -it -v /home/dock/Downloads:/usr/Downloads:ro ubuntu64 /bin/bash

docker还提供了一种高级的用法。叫数据卷。

数据卷:“其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的”。感觉像是由一个容器定义的一个数据挂载信息。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。

看示例:

docker run -v /home/dock/Downloads:/usr/Downloads --name dataVol ubuntu64 /bin/bash

创建一个普通的容器。用--name给他指定了一个名(不指定的话会生成一个随机的名子)。

再创建一个新的容器,来使用这个数据卷。

docker run -it --volumes-from dataVol ubuntu64 /bin/bash

--volumes-from用来指定要从哪个数据卷来挂载数据。

java持久化技术是为了将java对象与数据库表对应。

java中存储很多对象在内存是很浪费空间的,内存过于昂贵,与硬盘、磁带、光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需要一直供电吧。所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。

持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。

ActiveMQ持久化消息的二种方式;

1、持久化为文件

这个装ActiveMQ时默认就是这种,只要设置消息为持久化就可以了。涉及到的配置和代码有:

<persistenceAdapter>

<kahaDB directory="${activemqbase}/data/kahadb"/>

</persistenceAdapter>

producerSend(request, MsgDeliveryModePersistent, level, TimeSpanMinValue);

2、持久化为MySql

首先需要把MySql的驱动放到ActiveMQ的Lib目录下,我用的文件名字是:mysql-connector-java-504-binjar

接下来修改配置文件

<persistenceAdapter>

<jdbcPersistenceAdapter dataDirectory="${activemqbase}/data" dataSource="#derby-ds"/>

</persistenceAdapter>

在配置文件中的broker节点外增加

<bean id="derby-ds" class="orgapachecommonsdbcpBasicDataSource" destroy-method="close">

<property name="driverClassName" value="commysqljdbcDriver"/>

<property name="url" value="jdbc:mysql://localhost/activemqrelaxAutoCommit=true"/>

<property name="username" value="activemq"/>

<property name="password" value="activemq"/>

<property name="maxActive" value="200"/>

<property name="poolPreparedStatements" value="true"/>

</bean>

从配置中可以看出数据库的名称是activemq,需要手动在MySql中增加这个库。

然后重新启动消息队列,会发现多了3张表

1:activemq_acks

2:activemq_lock

3:activemq_msgs

对象持久化,也就是可以把这个对象永远的保存起来,这里的保存不仅是对象本身,还包括他的属性和所依赖的其他类。通常,对象可以持久化到文件或者是数据库中。我这里只介绍如何将对象存储到数据库中。恰巧Oracle数据库为我们提供了这样的方便。

在Oracle中,有一种blog的字段类型,它是用来存储大量的二进制数据的。我们就利用这个字段去存储对象信息。

首先建立一个测试表:

create table TESTBLOB

(

NAME VARCHAR2(50) not null,

CONTENT BLOB not null,

ID NUMBER(8) not null

)alter table TESTBLOB

add constraint IDFORTEST primary key (ID);

只用三个字段,其中id是属性,content是我们要存储对象的字段。

先来看看我们要存入的对象:

import javaioSerializable;

import javautilDate;

import javautilList;

public class TestObject implements Serializable {

private static final long serialVersionUID = 4558876142427402513L;

/

@param args

/

private String name;

private String password;

private Date date;

private List<City> cityList;

public List<City> getCityList() {

return cityList;

}

public void setCityList(List<City> cityList) {

thiscityList = cityList;

}

public Date getDate() {

return date;

}

public void setDate(Date date) {

thisdate = date;

}

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

thispassword = password;

}

}

记得要实现Serializable接口,可以看到这是一个包含了string,date,和list类型的对象,为了给测试增加复杂度,我们的list是另外一个对象(city)的list,如下:

import javaioSerializable;

public class City implements Serializable{

private static final long serialVersionUID = 4558876127402513L;

private String name;

private String code;

public String getCode() {

return code;

}

public void setCode(String code) {

thiscode = code;

}

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

}

City对象包括了城市名称和区号。下面是主要的应用了。

import javaioBufferedInputStream;

import javaioByteArrayInputStream;

import javaioByteArrayOutputStream;

import javaioInputStream;

import javaioObjectInputStream;

import javaioObjectOutputStream;

import javaioOutputStream;

import javasqlConnection;

import javasqlDriverManager;

import javasqlResultSet;

import javasqlStatement;

import javautilArrayList;

import javautilDate;

import javautilList;

import oraclesqlBLOB;

public class Test {

public static void main(String[] args) {

//创建测试用对象

City beijing = new City();

beijingsetName("北京");

beijingsetCode("010");

City shanghai = new City();

shanghaisetName("上海");

shanghaisetCode("020");

City tianjin = new City();

tianjinsetName("天津");

tianjinsetCode("021");

List<City> cityList = new ArrayList<City>();

cityListadd(beijing);

cityListadd(shanghai);

cityListadd(tianjin);

TestObject obj = new TestObject();

objsetName("yangsq");

objsetPassword("111");

objsetDate(new Date());

objsetCityList(cityList);

try{

//将对象存入blob字段

ByteArrayOutputStream byteOut=new ByteArrayOutputStream();

ObjectOutputStream outObj=new ObjectOutputStream(byteOut);

outObjwriteObject(obj) ;

final byte[] objbytes=byteOuttoByteArray();

ClassforName("oraclejdbcdriverOracleDriver");

Connection con = DriverManagergetConnection(

"jdbc:oracle:thin:@:1521:", "yangsq", "yangsq");

consetAutoCommit(false);

Statement st = concreateStatement();

stexecuteUpdate("insert into TESTBLOB (ID, NAME, CONTENT) values (1, 'test1', empty_blob())");

ResultSet rs = stexecuteQuery("select CONTENT from TESTBLOB where ID=1 for update");

if (rsnext()) {

BLOB blob = (BLOB) rsgetBlob("CONTENT");

OutputStream outStream = blobgetBinaryOutputStream();

outStreamwrite(objbytes, 0, objbyteslength);

outStreamflush();

outStreamclose();

}

byteOutclose();

outObjclose();

concommit();

//取出blob字段中的对象,并恢复

rs = stexecuteQuery("select CONTENT from TESTBLOB where ID=1");

BLOB inblob = null;

if (rsnext()) {

inblob = (BLOB) rsgetBlob("CONTENT");

}

InputStream is = inblobgetBinaryStream();

BufferedInputStream input = new BufferedInputStream(is);

byte[] buff = new byte[inblobgetBufferSize()];

while(-1 != (inputread(buff, 0, bufflength)));

ObjectInputStream in =

new ObjectInputStream(

new ByteArrayInputStream(

buff));

TestObject w3 = (TestObject)inreadObject();

Systemoutprintln(w3getName());

Systemoutprintln(w3getPassword());

Systemoutprintln(w3getDate());

List<City> list = w3getCityList();

for(City city : list){

Systemoutprintln(citygetName() + " " + citygetCode());

}

stclose();

conclose();

} catch (Exception ex) {

exprintStackTrace();

Systemexit(1);

}

}

}

代码的蓝色部分创建了要存储的对象。再看红色的对象写入部分,它首先把对象转化成二进制流的形式。对于blob字段,我们不能简单的在insert时插入,实际上,insert时,对于blob字段,只能先插入一个空的blob对象empty_blob(),然后再进行"select CONTENT from TESTBLOB where ID=1 for update"对blob字段进行更新。返回后,我们只要把对象的二进制流写入即可。

OutputStream outStream = blobgetBinaryOutputStream();

outStreamwrite(objbytes, 0, objbyteslength);

需要注意的是,上述步骤必须设置consetAutoCommit(false),否则oracle会抛出异常。

接下来,绿色的代码是读取数据库中blob字段的对象,并恢复。我们要知道的是,所有对blob字段的 *** 作都是二进制的,即插入时是二进制流,读出时也是二进制流。然后用io修饰器(ObjectInputStream)去修饰。以前学习java时,感觉它的io好繁琐啊,现在感觉还真是各有其用。下面是测试的输出结果。

yangsq

111

Tue Mar 27 12:11:28 CST 2007

北京 010

上海 020

天津 021

需要说明一下,buff的size一定要足够大,否则将抛出异常。在这里,我使用的是inblobgetBufferSize()来设置buff的size,这并不是一种好的方法,因为一般inblobgetBufferSize()都是32768,很可能出现异常,所以这个size最好自己设置,或系统运行时刻设置(幸好java提供数组长度的运行时刻设置)。

以上就是关于docker中oracle数据库数据持久化的问题,如果将本地的文件夹挂载到docker容器中全部的内容,包括:docker中oracle数据库数据持久化的问题,如果将本地的文件夹挂载到docker容器中、java的持久化有什么用、用java代码如何设置activemq消息持久化到数据库中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9368078.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存