RandomAccessFileを使用して、ファイルをアクセスすると「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」のメッセージが出力されるときがある。
以下は例です。
<pre>
DataInputStream index = null;
RandomAccessFile data = null;
long seek = 0;
int row = 0;
try {
index = new DataInputStream(new FileInputStream(new File("index.db")));
data = new RandomAccessFile("data.db", "rw");
byte[] buffer = new byte[32];
while (true) {
++row;
seek = index.readLong();
data.seek(seek);
data.read(buffer);
}
} catch (EOFException e) {
} catch (IOException e) {
System.err.println(String.format("[%d]: seek=%d -- エラーの発生したレコード番号.", row, seek));
e.printStackTrace();
} finally {
if (index != null) {
index.close();
}
if (data != null) {
data.close();
}
}
</pre>

エラーが発生するレコード位置(row)は、まちまちで実行する度に変化する。
1000件目であったり、157件目であったり。。。
index.dbは約100万件あります。

(a).正常に動作する環境
OS: Windows XP、Windows 7
CPU: Core 2 Duo、CORE i5

(b).エラーが発生する環境
OS: Windows server 2008 R2 standees sp1
CPU: Intel(r) Xeon(r) CPU X5690@3.46GHz (2プロセッサ)

どういった原因が考えられますか?
因みに、RandomAccessFileのモードを"r"にすると正常に動作しました。
モードで排他ロックするのでしょうか?
RandomAccessFile#getChannel().lock()は使用していません。

(a)の方は最大4コアで、(b)の方は24コアあります。
(b)の方が早すぎてリードにブロックされているとかありますか?
ただモードを変更しただけで正常に動作するのも理解できません。

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

複数同時に実行、もしくはファイルを使用していませんか?


ウィンドウズでは、書き込み可能なモードで開くとロックしてしまいます。
読み込みだけで良いなら、ロックしない分rだけにした方が早いはずです。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q美容室の広告に載っている「ワンプロセス」の意味。

髪を切ろうと思い、ホットペッパーで美容室を
探していました。

カラーとか、パーマのとこに「ワンプロセスのみ」
という表示がされていることがありますが、
これはどのような意味なのでしょうか?

ご存知の方、教えてください。よろしくお願いします。

Aベストアンサー

ワンプロセスと言うのは、1回だけと言うことです。

たとえばカラーなら、1度薬液を付けるだけとかです。
カラーの場合は、新生毛とカラーの毛(既成毛)とでは色合いが違いますので、同じ薬液を塗れませんので2プロセス以上の施術になりますね。

Qhtmlファイルでするとできるのにcgiファイルでするとできないのはなぜでしょう?

お世話になります

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<title>com</title>
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script type="text/javascript"><!--
window.onload=function() {
document.getElementsByClassName = function (className) {
var i, j, eltClass;
var objAll = document.getElementsByTagName ? document.getElementsByTagName("*") : document.all;
var objCN = new Array();
for (i = 0; i < objAll.length; i++) {
eltClass = objAll[i].className.split(/\s+/);
for (j = 0; j < eltClass.length; j++) {
if (eltClass[j] == className) {
objCN.push(objAll[i]);
break;
}
}
}
return objCN;
}

obj = document.getElementsByClassName("trans_e");
for(i=0;i<obj.length;i++) {
l = obj[i].innerHTML;
obj[i].style.width = l + "px";
}
}
//--></script>

<style type="text/css"><!--
.trans_a {
float:left;
width:20px;
}
.trans_b {
float:left;
width:100px;
}
.trans_c {
margin-top:10px;
}
.trans_d {
float:left;
width:200px;
}
.trans_e {
background-color:red;
margin-bottom:2px;
}

--></style>
</head>
<body>
<div>
<div class="trans_a"></div>
<div class="trans_b"><img src="./img/non.png" alt="$shuzoku">
<div class="trans_c">$type</div></div>
<div class="trans_d">
<div class="trans_e">41</div>
<div class="trans_e">40</div>
<div class="trans_e">47</div>
<div class="trans_e">35</div>
<div class="trans_e">22</div>
<div class="trans_e">11</div>
</div>
</div>
</body>
</html>

このようにclass="trans_e"のところをその中に書かれている数値で幅を可変させようとしているのですがhtmlファイルで試すと思ったようなことをしてくれるのですがcgiファイルに組み込むと幅が100%のまま変わらないのですが解決策をご存知の方いらっしゃいますでしょうか?
getElementByIdですればできるのですが結構数があるものですので・・・--;

お世話になります

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<title>com</title>
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script type="text/javascript"><!--
window.onload=function() {
document.getElementsByClassName = function (className) {
...続きを読む

Aベストアンサー

ごめんなさい直し忘れました

split(/\s+/);

split(/\\s+/);
といった具合に修正しましょう

またはこの部分を外部JSファイルなどにしてしまって
<script type="text/javascipt" src="ファイルパス"></script>
といった具合にしてしまうとかでしょう

Q4プロセス数IIの191 の、解説の画像の赤線部分の意味がわかりません。何故q=0だと平行にならない

4プロセス数IIの191 の、解説の画像の赤線部分の意味がわかりません。何故q=0だと平行にならないのでしょうか。

どなたか分かる方解説おねがいします!


問 円x²+y²=5の接線が、次の条件を満たすとき、その接線の方程式と接点の座標をもとめよ。

直線x+2y=1に平行

Aベストアンサー

両辺をqで割るために、まず、q=0を考える必要があるためです。
実際には、q=0ですから、px=5 ∴ x=5/p
となり y軸に平行な直線で、x+2y=1とは平行にならず
条件を満たしません!

QJavaで、TomCatプロジェクトを使用したJDBCを使用したデータベースのアクセスについて教えてください。

すぐに回答を! TomCatプロジェクトでDBアクセスできず困っています。

●Javaプロジェクトの場合(成功)
 ・Javaプロジェクト作成 → 新規 → クラスを作成。
 ・プロジェクト選択 → メニューバー「プロジェクト」 → プロパティー
  → Javaのビルド・パス → ライブラリーの追加 → ユーザーライブラリー
  → 新規 → MySQLドライバを追加
 ・次のソースの実行にて、JDBC Dirverの接続を確認。

[JdbcSample.java]
import java.sql.*;
class JdbcSample {
public static void main(String[] args) {
try {

// 1.JDBC Driver の登録
Class.forName("com.mysql.jdbc.Driver").newInstance();

// 2.データベースへの接続
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost/db1", "(ユーザー名)", "(パスワード)");

// 3.SQL ステートメント・オブジェクトの作成
Statement stmt = con.createStatement();
// 4.SQL ステートメントの発行
ResultSet rs = stmt.executeQuery("SELECT * from null_test_tbl");
// 5.結果の出力
while (rs.next()) {
System.out.println(rs.getString("allow_null"));
}

// 6.データベースのクローズ
rs.close();
stmt.close();
con.close();

} catch (SQLException e1) {
System.out.println(
"SQLException: " + e1.getMessage());
System.out.println(
" SQLState: " + e1.getSQLState());
System.out.println(
" VendorError: " + e1.getErrorCode());
} catch (Exception e2) {
System.out.println(
"Exception: " + e2.getMessage());
}
}
}

●TomCatプロジェクト作成の場合(失敗)
 (1)TomCatプロジェクト作成 → 新規 → クラスを作成。
 (2)プロジェクト選択 → メニューバー「プロジェクト」 → プロパティー
  → Javaのビルド・パス → ライブラリーの追加 → ユーザーライブラリー
  → 新規 → MySQLドライバを追加
 (3)サーブレットからBeanの呼び出し。
 「​http://localhost:8080/test_mvc/jdbcSample​」
 (4)エラー「Exception: com.mysql.jdbc.Driver」 が発生。(ドライバーが見つかりません?)

[servlet]
package ne.jp;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestMvc extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


JdbcSample da = new JdbcSample();


try {
da.dbAccessTest(); (※)←ここでBeanのデータベースアクセスメソッドを呼び出し
} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}


// HTML出力の準備
response.setContentType("text/html;charset=Shift_JIS");
PrintWriter out = response.getWriter();

out.println("<html><body><p>こんにちわ!</p></body>");
}

}

[Bean]
package ne.jp;
import java.sql.*;

class JdbcSample {

//Beanコンストラクタ
public JdbcSample(){
}

//データベースアクセス確認
public void dbAccessTest(){

try {

// 1.JDBC Driver の登録
Class.forName("com.mysql.jdbc.Driver").newInstance();

// 2.データベースへの接続
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost/db1", "***", "*****");

// 3.SQL ステートメント・オブジェクトの作成
Statement stmt = con.createStatement();
// 4.SQL ステートメントの発行
ResultSet rs = stmt.executeQuery("SELECT * from null_test_tbl");
// 5.結果の出力
while (rs.next()) {
System.out.println(rs.getString("allow_null"));
}

// 6.データベースのクローズ
rs.close();
stmt.close();
con.close();

} catch (SQLException e1) {
System.out.println(
"SQLException: " + e1.getMessage());
System.out.println(
" SQLState: " + e1.getSQLState());
System.out.println(
" VendorError: " + e1.getErrorCode());
} catch (Exception e2) {
System.out.println(
"Exception: " + e2.getMessage());
}
}
}

すぐに回答を! TomCatプロジェクトでDBアクセスできず困っています。

●Javaプロジェクトの場合(成功)
 ・Javaプロジェクト作成 → 新規 → クラスを作成。
 ・プロジェクト選択 → メニューバー「プロジェクト」 → プロパティー
  → Javaのビルド・パス → ライブラリーの追加 → ユーザーライブラリー
  → 新規 → MySQLドライバを追加
 ・次のソースの実行にて、JDBC Dirverの接続を確認。

[JdbcSample.java]
import java.sql.*;
class JdbcSample {
public static void main(S...続きを読む

Aベストアンサー

Tomcatは起動時に "[Tomcatディレクトリ]/lib" ディレクトリ配下のライブラリがクラスパスに追加されます。

Javaプロジェクトの場合は「Javaのビルド・パス=実行時のクラスパス」として設定されますが、TomCatプロジェクト作成の場合は「Javaのビルド・パス=実行時のクラスパス」とはなりません。

"[Tomcatディレクトリ]/lib" ディレクトリ配下にMySQLのJDBCドライバのjarファイルを置いてもう1度確認してみて下さい。

Qプロセス監視とサービス監視

下記の質問にてプロセスとサービスの違いについて少し理解ができました。
http://oshiete.goo.ne.jp/qa/7395829.html

しかし、私の理解が正しいとするとプロセスはサービスよりも詳細な単位になるためプロセス監視を行えばサービス監視は行えているということになります。

そこで二点質問がございます。
1.上記の私の理解は正しいか
2.プロセス監視ではなく、サービス監視を行う具体的な意味は

ご教示いただけますと幸いです。

Aベストアンサー

・UNIX系のinetdやwindowsのsvchostなどプロセス名とサービスが単純に結びついていないサービスがあります。
・プロセスは起動しているが、ハングアップなどでサービスとして機能していない場合があります

QJava1.3.1を使用してXMLファイルをアクセスする方法

現在悩んでいます。
Java1.3.1を使用してXMLファイルをアクセスしたいの
で、インターネットで調べパッケージ名がどれかを調
べたら、標準にはないとのことでした。
よくよく調べると、「Java1.4」にはあるようでした。
別途、入手しなくてはならないのでしょうか?
少々(多々?)意味不明な文書かも知れませんが、整
理すると、タイトルに記述した内容をしたいです。
すみませんが、その術を教えてください。
Javaのバージョンをあげる事はできないです。該当す
るパッケージを入手して実行環境に設定する許可はま
だとっていないのが現状です。
すみませんが、よろしくお願いします。

Aベストアンサー

参考URLにあるXML用のオプションパッケージを入手すれば
たぶん大丈夫です。

がんばってくださいね!

参考URL:http://java.sun.com/xml/downloads/javaxmlpack.html

Q子プロセス、

親プロセスから子プロセスを生成するとは具体的に何を意味しているのでしょうか?
またresume文とはなんでしょうか?
何をしてくれているのでしょうか?
なぜUNIXは安定していると言われるのでしょうか?
聞いたけど忘れてしまいました、
お願いします。

Aベストアンサー

再レスです。
身近な例ですとエクセルとかで新規作成ボタンを押すと新しいシートが作られるじゃないですか。
いくつも作れてどれも同じ動作やインターフェースをしています。
それらのシートはボタンが押されるまで存在しなかったものです。
また、それらは独立しているので、どのシートに移動しても構いませんよね。
立派な子プロセスですよね。メモ帳なんかだと親プロセスが新たに開きますね。
この例ではユーザーの操作によるものですが、プログラムによっては内部でプロセスを作り並列的に動作するものもあります。

Q子プロセスで発生した例外を親プロセスでキャッチしたい

以下のようにプログラムをかいてみましたが、AssertionErrorをキャッチできません。
Fooクラス内のassert文で必ずAssertionErrorが発生するようにしています。

String[] command = {"java", "Foo"};
try{ Process process = runtime.exec(command); }
catch(IOException e){ }
catch(AssertionError ae){
System.out.println(ae.toString());
}

Aベストアンサー

例外は質問文のような使い方をするものではありません。
Runtime.exec()で実行してしまうと、
そこで行われているJavaプログラムと、
元のプログラムで行われているJavaプログラムはいちおう別物なので、
例外の受け渡しはできません。
せいぜいエラーレベルを取得するか、
エラー結果の出力を得るくらいです。(Processクラスのメソッド参照)

やったことがないので自信ないのですが、

String[] command = {"java", "Foo"};
try{ Foo.main(); }
catch(IOException e){ }
catch(AssertionError ae){
System.out.println(ae.toString());
}

としてみたらどうでしょうか。
Fooのmainにthrows宣言を書く必要があるかもしれません。
それでもだめかもしれないけど…。

Qビジネスの場における「プロセス」とは?

初めまして、今現在大学生で、企業にてインターンをやっています。

上司や社員と会話、会議をする際に「プロセス(Process)」という言葉がよく使われるんですが、その言葉自体の概念、意味を理解できていないせいでまったくピンと(理解で)きません。

例えば、ある事、業務を上司に説明した際に、
「プロセスでものを考えないと伝えたいことが上手く伝わらない」、
「このプロジェクトに関してのプロセスを資料としてまとめて」など言われます。

ここで言う「プロセス」とはどういう事でしょうか?
質問が抽象的過ぎて、答えにくいかと思いますがお願いします。

Aベストアンサー

日本語としては「手順」・「流れ」でいいんですが、「プロセス」と
言った場合、言外に「何か全体としての"システム"が存在して、
その結果としての"手順"」という意味があります。

「システム」が中身で、それが外に出てきたものが「プロセス」と
いう感じですね。往々にしてこの2つの言葉はセットにして使われ
たりしますし・・・。

単に「手順」と受け取ると、言外にある「全体としての"システム"」
を見落としてしまう可能性がある、という点には注意して下さいね。

QJavaのRandomAccessFileについて教えてください。

お世話になります。
 Java(アプレットとして使用しています。)を最近から勉強し
始めました。
 現在、作成しようとしているプログラムは、C言語で言うところの
構造体の項目をバイナリファイル内の任意の位置に読み書きしたいと
思っております。
 現在、Javaでは、構造体の概念が見当たらなかったので、
Classで各フィールドを定義して、各フィールドの値を
ByteBufferでByte配列に配置して、RandomAccessFileでこの配列の内容を書き込んだり、この逆の方法で
読み出したりしています。
 この方法だと、各フィールドをわざわざ一つ一つByte配列に
配置しなければならず、面倒です。
 他の言語の構造体やレコードの概念の様にフィールドの塊を
一気にランダムファイルに簡単に読み書きする方法は有りませんでしょうか?
 ご存知の方がいらっしゃいましたら、ご教示の程、是非よろしくお願いします。

Aベストアンサー

おそらくそのような方法はないと思います。
Javaのオブジェクトが実際にどのような配置になっているかは処理系依存で、
たとえばフィールドが定義した順番に並んでいるとも限らないですし、
C言語のようにアドレスが丸出しになっていないということもあります。

C言語でも構造体をfwriteで書き出してしまうと移植性が犠牲になりますから、
構造体のメンバをひとつひとつ出力するほうが望ましいとは言われます。
ましてや安全性にとくに気を使っているJavaにそのような機能がないのは致しかたないように思います。

もしオブジェクトを手軽に丸ごと保存したいようならシリアライズが使われます。
「フィールドの塊を一気にランダムファイルに簡単に読み書きする」というのを見る限り、もしかしたらお求めのものはシリアライズなのかもしれません。
そうではなく、どうしてもバイナリファイルの読み書きが面倒であれば、
リフレクションでフィールドを動的に調べて自動的に読み書きすることはできなくもないでしょう。
とはいえ、RandomAccessFileで読み書きするのはごく妥当な方法だと思います。

おそらくそのような方法はないと思います。
Javaのオブジェクトが実際にどのような配置になっているかは処理系依存で、
たとえばフィールドが定義した順番に並んでいるとも限らないですし、
C言語のようにアドレスが丸出しになっていないということもあります。

C言語でも構造体をfwriteで書き出してしまうと移植性が犠牲になりますから、
構造体のメンバをひとつひとつ出力するほうが望ましいとは言われます。
ましてや安全性にとくに気を使っているJavaにそのような機能がないのは致しかたないように思...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報